Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2012, 04:25   #1
Mortimoro
Форумчанин
 
Регистрация: 03.12.2010
Сообщений: 334
По умолчанию максимальный id из выбранных

допустим, выбираю из таблицы некоторый набор значений:
PHP код:
SELECT `id`,`nameFROM `tableWHERE `status`=1 LIMIT 100 
как лучше всего получить максимальный id из выбранных? проверять при каждой итерации какое значение больше или есть способ поэлегантнее?
Mortimoro вне форума Ответить с цитированием
Старый 15.11.2012, 08:07   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

Код:
SELECT MAX(`id`),'id',`name` FROM `table` WHERE `status`=1 LIMIT 100
ADSoft вне форума Ответить с цитированием
Старый 15.11.2012, 08:47   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Да ну, так нельзя! Не знаю, как там в MySQL, но нормальные СУБД не позволяют в в строке выбора запроса использовать агрегатные функции и поля, не сгруппированные GROUP BY

формально, я бы предложил вариант:
Код:
SELECT `id`,`name` FROM `table` WHERE `status`=1 order by ID desc LIMIT 1
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.11.2012, 08:53   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

может... но тут у чела смысл другой немнога - из выбранных 100 - среди них найти макс ... а не вообще. или я не прав?
ADSoft вне форума Ответить с цитированием
Старый 15.11.2012, 09:07   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

возможно, но я же о другом говорю. я не уверен, что Ваш вариант вообще отработает (если я ошибаюсь и MySQL позволяет подобные запросы, тогда, конечно, автору темы повезло, его этот запрос устроит).

как вариант:
Код:
SELECT `id`,`name`, (SELECT max(`id`) as `max_id` FROM `table` WHERE `status`=1 LIMIT 100)   FROM `table` WHERE `status`=1 LIMIT 100
Есть и другие варианты, можно и другие запросы попробовать...
Если, конечно, автора топика не устроит ваше решение...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.11.2012, 10:03   #6
masax
Форумчанин
 
Регистрация: 01.10.2008
Сообщений: 248
По умолчанию

это ж какие другие СУБД не позволяют?
MSSQL справится с таким запросом
Контакты
skype, почта: bm@kwax.ru
masax вне форума Ответить с цитированием
Старый 15.11.2012, 10:22   #7
Mortimoro
Форумчанин
 
Регистрация: 03.12.2010
Сообщений: 334
По умолчанию

спасибо, что откликнулись, но трехэтажные запросы ради получения одного числа мне кавайными не кажутся. Так как цикл мне все равно придется делать, решил все же сравнивать id с предыдущим:
PHP код:
if($id_max<$result['id']) $id_max=$result['id']; 
и смотрится лаконичнее, и нагрузка точно не больше, чем витиеватые запросы к мускулю.

я просто думал, может есть штатные функции, которые решают эту задачу сходу без необходимости делать 100 сравниваний - что-то типа выбора максимального значения из массива... не спал ночью, мозг не в состоянии правильно вопрос для гугля сформировать.
Mortimoro вне форума Ответить с цитированием
Старый 15.11.2012, 10:47   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
спасибо, что откликнулись, но трехэтажные запросы ради получения одного числа мне кавайными не кажутся.
если Вам нужно получить только один ID с максимальным значением, то никаких "трёхэтажных" запросов не понадобится.
достаточно:
Код:
SELECT MAX(`id`) FROM `table` WHERE `status`=1
или, если уж совсем быть точным:

Код:
SELECT MAX(`id`) from (select 'id' FROM `table` WHERE `status`=1 LIMIT 100)
Это будет практически гарантировано быстрее, чем проводить 100 сравнений в цикле. Впрочем, каким способо пользоваться - воля ваша!


Цитата:
Сообщение от masax
MSSQL справится с таким запросом
а Вы проверьте!
Имхо, Вы ошибаетесь, вот он, как раз, и не справится! (MS SQL - это нормальная СУБД.
будет ошибка примерно такая
Цитата:

Msg 8120, Level 16, State 1, Line 2
Column 'id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Последний раз редактировалось Serge_Bliznykov; 15.11.2012 в 10:50.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.11.2012, 14:06   #9
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

1 простой запрос к БД гораздо лучше 100 сравнений
есть и функции определяющие макс элемент в массиве.... только ваш код - ерунда какая то, и не совсем чего вы конкретно хотите добиться то?
ADSoft вне форума Ответить с цитированием
Старый 15.11.2012, 21:52   #10
Mortimoro
Форумчанин
 
Регистрация: 03.12.2010
Сообщений: 334
По умолчанию

Код:
SELECT MAX(`id`) from (select 'id' FROM `table` WHERE `status`=1 LIMIT 100)
этот вариант мне подходит, благодарю.


ADSoft, это код я привел для примера, чтоб не нагружать никого лишними раздумьями )) разумеется, у меня он немного иначе выглядит.
Mortimoro вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Печать в *.pdf выбранных листов Eugmai86 Microsoft Office Excel 11 26.03.2012 01:09
Перенос выбранных ячеек W3r3Wolf Microsoft Office Excel 5 26.10.2011 13:44
Добавление выбранных записей в БД Claster Помощь студентам 3 05.09.2011 11:13
Автоматическая постановка выбранных записей nickolassp Microsoft Office Access 6 18.05.2011 16:49
Дублирование выбранных ячеек. GrayBy Microsoft Office Excel 12 05.03.2011 13:07