1-я строка в группе по сравнению с последней строкой

#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 не имеет значения, оно только сортирует весь отфильтрованный результат в порядке убывания после выбора строки из каждой группы.