MySQL запрос

Trofimovyoa

select max(tid,name from names group by id

Как заставить MySQL возвращать значение name из той строки, в которой было найдено максимальное t?
(MySQL 3.23.55 вопреки ожиданиям возвращает в name первое попавшееся значение в группе.)

nik93

ожидания у тебя не правильные :)
select el1.name
from Elements el1 inner join
(select max(id) as maximum
from elements) el2
on el2.maximum = el1.id

ЗЫ это для MSSQL

Trofimovyoa

Да, MSSQL с вложенным запросом работает. Но может есть патч какой именно для мускула, чтоб значения, по которым не производится группировка, брал из строки, которую функция max/min выбрала?

Boris1980

А если строк с одинаковым max/min несколько?
брал из строки, которую функция max/min выбрала?

Trofimovyoa

тогда чтобы

брал из строки, которую функция max/min выбрала
то есть для этого случая не важно уже какую именно из строк вернет запрос, главное, чтобы в этой строке нужное поле было max/min.
Вот незадача, в старом мускуле вложенные запросы не работают, а через left join
SELECT s1.t, s1.id, s1.name
FROM names s1
LEFT JOIN names s2 ON s1.id = s2.id AND s1.t < s2.t
WHERE s2.id IS NULL;
очень долго получается (больше часа работало, а результатов так и не дало).
Оптимальным по скорости видится простой запрос с сортировкой по id,t. И затем уже в проге одним циклом пройтись и скопировать нужные строчки в результирующую табличку.

Boris1980

Агрегирующая функция возвращает не строку, а значение из диапазона. Тебе нужно чтоб в каждой группе по полю Id стояло еще и наименование этого Id, но их может быть несколько для группы с этим Id. Задай правило "какое наименование тебе нужно показать".

Boris1980

Не понял что тебе нужно
попробуй так

select max(t id, max(name)
from names
group by id

или

select max(t id, name
from names
group by id, name

Trofimovyoa



Задай правило "какое наименование тебе нужно показать"
нужно получить последнее (поэтому оно находится в строке с максимальным t) присвоенное идентификатору (id) имя (name).
То есть, в результатах нужно видеть id, последнее имя, время присваивания этого имени. Одновременно (то есть с одинаковым t) одному идентификатору два имени присвоено быть не может.

Elina74

select t,id,name from names order by t desc limit 1
desc или asc

Elina74

а еще есть такая фишка: LAST_INSERT_ID
UPDATE messages set threadid=id WHERE id=LAST_INSERT_ID

Trofimovyoa

Отличный вариант, так и было реализовано сначала, пока табличка не выросла и вызывать такой запросик N раз (по разу для каждого id) не стало слишком долго.
Вот так


Оптимальным по скорости видится простой запрос с сортировкой по id,t. И затем уже в проге одним циклом пройтись и скопировать нужные строчки в результирующую табличку.
примерно в 130 раз быстрее стало работать.
Оставить комментарий
Имя или ник:
Комментарий: