我是 SQL 新手,想要使用联接执行查询。
我注意到的是,当我的表中有两行时workers_send_times然后我将相同的行加倍,就像
start_time: 2024-01-01
end_time: 2024-01-02
start_time: 2024-01-01
end_time: 2024-01-02
start_time: 2024-01-01
end_time: 2024-01-02
start_time: 2024-01-01
end_time: 2024-01-02
所以我有 2 行,但得到 4 行。如果workers_send_times 表中有 4 行,那么我得到 16 行,所以它显示了重复的行。
我做错了什么?
SELECT
u.id,
u.firstname,
u.lastname,
wp.location_orders_id,
l.name,
wst.start_time,
wst.end_time
FROM users u
INNER JOIN workers_plan wp
ON wp.user_id = u.id
INNER JOIN workers_send_times wst
ON wst.user_id = u.id
LEFT JOIN location_orders lo
ON lo.id = wp.location_orders_id
LEFT JOIN location l
ON l.id = lo.location_id
WHERE u.id = '32dc3da6-1e56-4a14-b8b5-8f532edb1b04'
所以我用谷歌搜索如何防止然后我遇到了 group by。
我添加了GROUP_BY wst.id,因为我想按我的workers_send_times id进行分组,这样我就不会得到重复的行。
但是 Postgresql 对我说,我必须将所有选择的数据显示在分组中,如下所示:
GROUP BY wst.id, u.id, wp.location_orders_id, l.name, wst.start_time, wst.end_time
所以现在它可以工作了,我没有得到重复的行,但是我错过了什么或者我可以做得更好吗?您会在我的查询中更改什么?
这对于评论来说太长了,所以我将其添加为答案。 GROUP BY 是 SQL 中一个强大的运算符,但我感觉它经常被误解。在您的示例中,您可以添加一个或多个聚合函数,例如 COUNT、MIN、MAX 等。然后您可以将它们应用到每个组:
SELECT u.id
, u.firstname
, ...
, COUNT(*)
如果你不打算在你的组中应用这样的功能,一个简写是使用 DISTINCT。 DISTINCT 不是一个函数,它适用于整行,您的示例将是:
SELECT DISTINCT u.id
, u.firstname
, ...
FROM users u
JOIN workers_plan wp
ON wp.user_id = u.id
JOIN workers_send_times wst
ON wst.user_id = u.id
LEFT JOIN location_orders lo
ON lo.id = wp.location_orders_id
LEFT JOIN location l
ON l.id = lo.location_id
WHERE u.id = '32dc3da6-1e56-4a14-b8b5-8f532edb1b04'
我在示例中使用了较短形式的 INNER JOIN(仅 JOIN)。也就是说,你的方法很好而且更通用(假设你想稍后应用一个函数),但不同的是有点短,也许更明显。