Zul*_*din 0 sql postgresql join left-join
我有 2 张桌子:
users table
+--------+---------+
| id | integer |
+--------+---------+
| phone | string |
+--------+---------+
| active | boolean |
+--------+---------+
statuses table
+---------+---------+
| id | integer |
+---------+---------+
| user_id | integer |
+---------+---------+
| step_1 | boolean |
+---------+---------+
| step_2 | boolean |
+---------+---------+
Run Code Online (Sandbox Code Playgroud)
我正在使用这样的子句对表进行LEFT OUTER JOIN statuses表操作:usersWHERE
SELECT users.id, statuses.step_1, statuses.step_2
FROM users
LEFT OUTER JOIN statuses ON users.id = statuses.user_id
WHERE (users.active='f')
ORDER BY users.id DESC
Run Code Online (Sandbox Code Playgroud)
我的问题
表中有些用户具有相同的电话号码users,我想根据电话号码删除重复的用户。
我不想从数据库中删除它们。但只想将此查询排除在外。
例如,假设John(ID:1)和Sara(ID:2)共享同一个电话号码(+6012-3456789),删除其中一个,John或Sara对我来说都可以。
我已经尝试过但没有成功?
第一的:
SELECT DISTINCT users.phone
FROM users
LEFT OUTER JOIN statuses ON users.id = statuses.user_id
WHERE (users.active='f')
ORDER BY users.id DESC
Run Code Online (Sandbox Code Playgroud)
第二:
SELECT users.phone, COUNT(*)
FROM users
LEFT OUTER JOIN statuses ON users.id = statuses.user_id
WHERE (users.active='f')
GROUP BY phone
HAVING COUNT(users.phone) > 1
Run Code Online (Sandbox Code Playgroud)
我会在加入之前这样做。在 Postgres 中,select distinct on是一个非常有用的结构:
SELECT u.id, s.step_1, s.step_2
FROM (SELECT distinct on (phone) u.*
FROM users u
WHERE u.active = 'f'
ORDER BY phone
) u LEFT OUTER JOIN
statuses s
ON u.id = s.user_id
WHERE u.active = 'f'
ORDER BY u.id DESC;
Run Code Online (Sandbox Code Playgroud)
distinct on对于括号中的内容返回一行。在这种情况下,那就是phone(基于“我想根据电话号码删除重复的用户”)。然后,join不应将这些显示为重复项。