Group By与Last Row的第一排

时间:2011-10-10 17:01:29

标签: mysql

想知道如何返回MySQL组中的第一行与最后一行。返回一系列日期,但需要显示第一个日期。

select * from calendar where approved = 'pending' group by eventid; 

5 个答案:

答案 0 :(得分:3)

听起来你想使用ORDER BY而不是GROUP BY:

select * from calendar where approved = 'pending' order by eventid asc limit 1;

答案 1 :(得分:2)

使用min的{​​{1}}函数insead返回组中的第一行与最后一行。

max

如果您想要每个组的整行,请加入自己的表格,过滤每个组的最小日期:

select min(date) from calendar ...

演示:http://www.sqlize.com/6lOr55p67c

答案 2 :(得分:2)

当您使用GROUP BY时,MySQL不保证您获得的每个组中的哪一行。实际上,理论上它甚至可以从一行中选择一些列,而从另一行中选择一些列。 MySQL Reference Manual说:

  

“MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。[...]您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能但是,这主要适用于每个未在GROUP BY中命名的非聚合列中的所有值对于每个组都相同的情况。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定“。

你想做的事情是这样的:

SELECT
  calendar.*
FROM
  calendar
  NATURAL JOIN (
    SELECT
      eventid, MIN(date) AS date
    FROM
      calendar
    GROUP BY eventid
  ) AS foo

答案 3 :(得分:0)

如果你想显示group-by语句的第一个和最后一个元素,这对我很有用:

SELECT min(date) AS minn, max(date) AS maxx 
FROM table_name
GROUP BY occasion

感谢您提出问题

答案 4 :(得分:0)

我有解决方案。要选择组中的最后一行,请使用此

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无关紧要,只有在选择了每个组的一行后,才按降序对整个过滤结果进行排序。