MySQL GROUP BY 查询仅返回一行


MySQL GROUP BY query returns only one row

    $q2 =   "SELECT startdate, 
             GROUP_CONCAT(summary separator '<br />') as summary, 
             GROUP_CONCAT(TIME(startdate)) AS starttime, 
             GROUP_CONCAT(TIME(enddate)) AS endtime
             FROM oc_clndr_objects
             WHERE calendarid = $calID
             GROUP BY DATE(startdate)
             ORDER BY startdate ASC";

上面的查询只返回一个结果(一个 1 个日期的 3 个事件符合预期) - 但是每天有 1 个事件重复,并且查询不会超过第一个开始日期。

我知道它与 GROUP BY 子句和聚合函数有关,但我无法理解它。 - 输出在 http://www.deliriousdreams.co.uk/可见 - "DJ时间表测试"

任何有关更正稍微非法的SQL查询的帮助将不胜感激。

编辑:好吧,时髦的人,修改为DATE(startdate)作为开始日期。一个小问题,之后我希望能够按日期和时间(最早的在前)对它们进行排序 - 显然 DATE 和 TIME 都是从开始日期(DATETIME 戳)派生的 - 这可以通过修改上面的查询还是我必须做一些 PHP 巫术?

您正在选择开始日期,但按DATE(startdate)分组

如果字段开始日期是日期时间,并且您只想按日期分组,则应选择一个数据并按日期分组。

尝试将查询更改为此查询

         SELECT DATE(startdate) AS startdate, 
         GROUP_CONCAT(summary separator '<br />') as summary, 
         GROUP_CONCAT(TIME(startdate)) AS starttime, 
         GROUP_CONCAT(TIME(enddate)) AS endtime
         FROM oc_clndr_objects
         WHERE calendarid = $calID
         GROUP BY DATE(startdate)
         ORDER BY startdate ASC

我希望$calID是干净的变量,否则您的代码会受到SQL注入的影响

它完成了!这就是我一直在寻找的解决方案...

SELECT
       DATE(startdate) AS startdate, 
       GROUP_CONCAT(summary separator '<br />') as summary, 
       GROUP_CONCAT(TIME(startdate)) AS starttime, 
       GROUP_CONCAT(TIME(enddate)) AS endtime
FROM
       (SELECT * FROM oc_clndr_objects ORDER BY startdate ASC) AS temp
WHERE calendarid = $calID
GROUP BY DATE(startdate)
ORDER BY DATE(startdate) ASC