我有一张
tickets
表,其中包含以下信息:
ticket_id | user_id | used_at
----------------------------------------
xxx | xxx | datetime
xxx | xxx | datetime
xxx | xxx | datetime
我想获取拥有 只有一张门票且其日期为 USED_AT 的所有用户的列表。
我当前的选择工作是为了获取用户和他们的第一张票日期。
SELECT
washtickets.id,
washtickets.user_id,
washtickets.used_at
FROM
washtickets,
(SELECT user_id, min(used_at) AS used_at FROM washtickets GROUP BY user_id) max_user
WHERE
washtickets.deleted_at IS NULL
AND washtickets.user_id = max_user.user_id
AND washtickets.used_at = max_user.used_at
ORDER BY
used_at ASC;
但我不知道添加 COUNT(*) 来仅过滤拥有 仅一张已用票的用户。
有什么帮助吗?
First JOINS 是 20 多年来的 SQL 标准,所以请使用它们
Count
是一个聚合函数,所以你需要一个GROUP BY
不在
GROUP BY
中的所有列都必须具有聚合函数,因为您只希望拥有一张票的人,因此 id 应该只有一个数字,因此聚合函数并不重要。
SELECT
MIN(w.id),
w.user_id,
w.used_at
FROM
washtickets w JOIN
(SELECT user_id, min(used_at) AS used_at FROM washtickets GROUP BY user_id) max_user
ON
w.deleted_at IS NULL
AND w.user_id = max_user.user_id
AND w.used_at = max_user.used_at
GROUP BY w.user_id, w.used_at
HAVING COUNT(*) = 1
ORDER BY
used_at ASC;