GROUP BY和ORDER BY不一起工作

时间:2014-07-17 13:42:31

标签: mysql sql

我有这个选择,根据日期显示用户事件。但是现在结果显示得很好但没有今天的事件,我也需要它们。我按用户ID分组:

SELECT 
a.id,
a.title,
a.name,
a.surname,
a.zip,
a.city,
a.address,
a.spec,
a.active,
b.start,
b.user,
b.status 
FROM user a 
INNER JOIN appointement b 
ON a.id=b.user WHERE a.spec='$spec' 
AND b.status='open' 
AND a.active='1' 
AND b.start>='$date' 
GROUP BY a.id 
ORDER BY b.start ASC

数据库中的日期采用以下格式:2014-07-31 08:15:00,就像$date一样 问题可能出现在那个日期吗?

1 个答案:

答案 0 :(得分:0)

使用GROUP BY子句,所有行都基于GROUP BY子句中共享相同字段值的行放在一起。其他字段设计为来自聚合函数,尽管MySQL默认不强制执行此操作。

使用您的查询,您正在尝试获取每个用户的所有约会。但是当你将GROUP BY作为用户的id时,它会将约会范围缩小到该用户的一个单独的appoitnment。它选择的哪个约会没有定义,可能会有变化。

如果您希望每个用户拥有该行的所有约会详细信息,您可以使用GROUP_CONCAT将它们全部放入一个字段中。

SELECT 
    a.id,
    a.title,
    a.name,
    a.surname,
    a.zip,
    a.city,
    a.address,
    a.spec,
    a.active,
    GROUP_CONCAT(CONCAT_WS('-', b.start, b.user, b.status))
FROM user a 
INNER JOIN appointement b 
ON a.id=b.user WHERE a.spec='$spec' 
AND b.status='open' 
AND a.active='1' 
AND b.start>='$date' 
GROUP BY a.id 
ORDER BY b.start ASC

如果您只是想要每次使用第一次相关的约会,那么请使用子查询来识别它,并将其加入约会以获取详细信息

SELECT 
    a.id,
    a.title,
    a.name,
    a.surname,
    a.zip,
    a.city,
    a.address,
    a.spec,
    a.active,
    b.start,
    b.user,
    b.status 
FROM user a 
INNER JOIN
(
    SELECT user, MIN(start) AS first_app
    FROM appointment
    WHERE status='open' 
    AND start>='$date' 
    GROUP BY user
) sub0
ON a.id = sub0.user
INNER JOIN appointement b 
ON a.id=b.user 
AND sub0.first_app = b.start
WHERE a.spec='$spec' 
AND b.status='open' 
AND a.active='1' 
AND b.start>='$date' 
ORDER BY b.start ASC