2011-04-19 158 views
1

下面的代码工作,但我想组显示日期时间由他们最新的查询不是第一个日期时间查询。我试着改变ASC/DESC中的ORDER BY,但这只是改变了所有组的顺序,而不是组内的数据。我需要所有组和所有组的内部数据以最新的日期时间排序。GROUP BY ORDER BY帮助

$query="SELECT * FROM emails 
     WHERE sentto='$sid' 
     GROUP BY sentto 
     ORDER BY datetime DESC LIMIT $eu, $limit "; 

而不是将其显示组,第一个查询命令他们:从山姆·理查兹在2011年1月22日
消息(这是一组),从约翰·史密斯1月5日
消息, 2011
(这是一组)

我想让它显示的最新查询组,责令:上从约翰·史密斯
消息2011年4月19日
(TH是是一组)由山姆·理查兹
消息上2011年3月10日(这是一组)

请帮助。

回答

2

我觉得你的问题的一部分是,你是选择一组,通过查询非集合列。你应该清楚你想让它在合计查询结果中返回哪些值。

SELECT sentto, MAX(datetime) AS datetime FROM emails 
    GROUP BY sentto 
    ORDER BY datetime desc LIMIT $eu, $limit; 

我还不确定这会给你你想要的。这听起来像你想实际检索每个单独的电子邮件的行,并最大限度地使用GROUP BY排序。为此,您可能需要执行上述查询,然后返回并为每个sentto执行第二个查询。我想不出一种方法来在单个查询中做到这一点。

SELECT * FROM emails 
    WHERE sentto=$sid 
    ORDER BY datetime DESC; 

(对于每个sentto在第一个查询返回。)

+0

这几乎工作。我正在调整一些东西,试图弄明白。我几乎用一个查询来钉住它。 – yanike 2011-04-19 20:53:46

0

要将数据与组您所需要的ORDER BY子句中包括sentto排序。

试试这个:

SELECT * FROM emails 
      WHERE sentto='$sid' 
      GROUP BY sentto 
      ORDER BY sentto, datetime DESC LIMIT $eu, $limit 
+0

仍然没有奏效。它对组进行排序,但仍将组的第一项显示为最早的消息。 – yanike 2011-04-19 20:26:50

1

如何:

ORDER BY sentto ASC, datetime DESC 
+0

仍未显示组主要的最新日期时间消息。 – yanike 2011-04-19 20:24:39

+0

仍然没有工作。它对组进行排序,但仍将组的第一项显示为最早的消息。 – yanike 2011-04-19 20:31:59

+0

是的,重新阅读我并不完全确定我了解数据行是如何与所需输出进行比较的(您提到查看组的内部数据,但分组的目的是'折叠'满足条件转换为单行,所以除了集合函数(如MAX或SUM)之外,您不能看到数据。我认为布赖恩的回答看起来更好地满足您的需求。 – 2011-04-19 20:51:16