Не получается выполнить mysql запрос:(

golos81

Новичок
Не получается выполнить mysql запрос:(

Задача:
получить из таблицы id элемента, у которого максимальное значение в поле priority. Как это можно сделать?
 

golos81

Новичок
Пишу так:
SELECT id, MAX(priority) FROM `cats` GROUP BY id

После запуска скрипт задумывается на пару секунд (все в таблице 10 записей) и выводит все id таблицы, а мне надо вывести только один - с максимальным значением priority.
 

vadim

Guest
golos81
Ваш запрос означает: выбрать для каждого id его макс приоритет

Вот так работает:
SELECT id
FROM cats
WHERE priority=(SELECT MAX(priority) FROM cats)
 

zerkms

TDD infected
Команда форума
vadim
ты пробовал читать стартовый пост?
 

vadim

Guest
zerkms
Я просто из своего кода взял и забыл поменять название столбцов и таблицы (я думаю человек догодается свои подставить) - или в другом проблема?
 

zerkms

TDD infected
Команда форума
vadim
если бы ты внимательно посмотрел на тот запрос, который я написАл, потом задумался бы на пару секунд, то обнаружил бы что по результатам он полностью идентичен твоему, за исключением того, что будет работать быстрее и намного проще ;)))
 

vadim

Guest
zerkms
ТВой запрос правилен, я просто привёл другой пример

Кстати при большом количестве записей твой запрос в среднем будет работать медленней
Чтобы отсортировать таблицу по полю, которое не является ключём, нужно при использовании хорошего алгоритма (log(n))*n времени, мой же запрос тратит всего 2*n времени (максимум n на поиск макс числа, и потом опять макс n на поиск соответствующего ID)
при n>=4: (log(n))*n>2*n
 

zerkms

TDD infected
Команда форума
vadim
Код:
mysql> EXPLAIN SELECT * FROM `z_site_structure` ORDER BY `left_key` DESC LIMIT 1;
+----+-------------+------------------+------+---------------+------+---------+-----+------+-----------------+
| id | select_type | table            | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+------------------+------+---------------+------+---------+-----+------+-----------------+
|  1 | SIMPLE      | z_site_structure | ALL  | NULL          | NULL |    NULL | NULL |   62 | Using filesort |
+----+-------------+------------------+------+---------------+------+---------+-----+------+-----------------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT * FROM `z_site_structure` WHERE `left_key` = (SELECT MAX(`left_key`) FROM `z_site_structure`);
+----+-------------+------------------+------+---------------+------+---------+-----+------+--------------+
| id | select_type | table            | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+------------------+------+---------------+------+---------+-----+------+--------------+
|  1 | PRIMARY     | z_site_structure | ALL  | NULL          | NULL |    NULL | NULL |   62 | Using where |
|  2 | SUBQUERY    | z_site_structure | ALL  | NULL          | NULL |    NULL | NULL |   62 |             |
+----+-------------+------------------+------+---------------+------+---------+-----+------+--------------+
2 rows in set (0.01 sec)
как нибудь эти циферки прокомментируешь??
или и правда 62 > 62 * 62 ??
 

vadim

Guest
"Using filesort " - здесь же не показывается время. потраченное на сортировку
и не 62*62, а 62+62
 

vadim

Guest
>>ты уверен что ты хорошо подумал?
Не уверен, почему умножение???
 

vadim

Guest
zerkms
Я тогда не понимаю логику подзапросов.
Видимо, mysql для каждого значения id вызывает подзапрос.
Я думал наоборот, сначало исполняется подзапрос, а потом выполняется главный запрос (то такой логике было бы сумма, а не умножение)
 

zerkms

TDD infected
Команда форума
vadim
а теперь представь - что в подзапросе используются данные из самого запроса. как тогда?
[sql]
SELECT `f1` FROM `t` WHERE `id` = (SELECT MAX(`id`) FROM `t2` WHERE `f2` = `t`.`f1`)
[/sql]

ps: запрос не несёт никакой смысловой нагрузки - просто иллюстрация на синтетическом примере
 

vadim

Guest
zerkms
так такое по идеи не должно пройти, смысл подзапроса это то, что подзапрос совсем отдельный запрос никак не зависящий от основного.
Или я не так понял твой пост???
 
Сверху