我有这个选择,根据日期显示用户事件。但是现在结果显示得很好但没有今天的事件,我也需要它们。我按用户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
一样
问题可能出现在那个日期吗?
答案 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