#mysql
#mysql
Вопрос:
Хотите знать, как вернуть 1-ю строку в группе MySQL по сравнению с последняя строка. Возвращает ряд дат, но необходимо отобразить первую.
select * from calendar where approved = 'pending' group by eventid;
Ответ №1:
Похоже, вы хотите использовать ORDER BY вместо GROUP BY:
select * from calendar where approved = 'pending' order by eventid asc limit 1;
Ответ №2:
Используйте min
функцию insead of max
, чтобы вернуть первую строку в группе по сравнению с последней строкой.
select min(date) from calendar ...
Если вам нужна вся строка для каждой группы, присоединитесь к таблице, отфильтрованной по минимальным датам для каждой группы:
select c2.* from
(select eventid, min(dt) dt from calendar
where approved = 'pending' group by eventid) c1
inner join calendar c2 on c1.eventid=c2.eventid and c1.dt=c2.dt
group by eventid;
Демонстрация: http://www.sqlize.com/6lOr55p67c
Ответ №3:
При GROUP BY
таком использовании MySQL не дает никаких гарантий относительно того, какую строку в каждой группе вы получите. Действительно, теоретически он может даже выбрать некоторые столбцы из одной строки, а некоторые из другой. В справочном руководстве MySQL говорится:
«MySQL расширяет использование GROUP BY, чтобы список выбора мог ссылаться на неагрегированные столбцы, не названные в предложении GROUP BY . […] Вы можете использовать эту функцию для повышения производительности, избегая ненужной сортировки и группировки столбцов. Однако это полезно в первую очередь, когда все значения в каждом неагрегированном столбце, не названном в ГРУППЕ ПО, одинаковы для каждой группы. Сервер может выбирать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются неопределенными. «
Вместо этого вы хотите сделать что-то вроде этого:
SELECT
calendar.*
FROM
calendar
NATURAL JOIN (
SELECT
eventid, MIN(date) AS date
FROM
calendar
GROUP BY eventid
) AS foo
Ответ №4:
Если вы хотите показать первый и последний элемент инструкции group-by, это было полезно для меня:
SELECT min(date) AS minn, max(date) AS maxx
FROM table_name
GROUP BY occasion
Спасибо за вопрос
Ответ №5:
У меня есть решение. Чтобы выбрать последнюю строку в группе, используйте это
select * from calendar
where approved = 'pending'
group by eventid
ORDER BY max(`date`) DESC;
или это, чтобы выбрать первую строку из группы…
select * from calendar
where approved = 'pending'
group by eventid
ORDER BY min(`date`) DESC;
Значение DESC не имеет значения, оно только сортирует весь отфильтрованный результат в порядке убывания после выбора строки из каждой группы.