如果我有以下表格
users
ID NAME
1 john
2 jack
3 kate
4 sawyer
tasks
ID USER_ID TITLE
1 1 mow lawn
2 2 take out trash
3 1 file taxes
4 2 wash dishes
5 1 learn ruby
6 3 groom dog
如何确定有两个或更多任务的用户的姓名?
我想出了以下内容,但我想知道是否有更高效的查询。
SELECT name, cnt
FROM (SELECT count(t.user_id) cnt, u.name
FROM tasks t INNER JOIN users u ON u.id=t.user_id
GROUP BY t.user_id) as copy_table
WHERE cnt > 1
答案 0 :(得分:2)
SELECT count(t.user_id) cnt, u.name
FROM tasks t INNER JOIN users u ON u.id=t.user_id
GROUP BY t.user_id, u.name
HAVING count(t.user_id) > 1
或
with interesting as
(
SELECT count(t.user_id) cnt, t.user_id
FROM tasks t
GROUP BY t.user_id
HAVING count(t.user_id) > 1
)
select cnt, u.name
from users u
join interesting i on u.id = i.user_id
答案 1 :(得分:0)
SELECT users.*
FROM users
INNER JOIN (SELECT user_id
FROM tasks
GROUP BY user_id
HAVING COUNT(*) > 1) x ON x.user_id = users.id
答案 2 :(得分:0)
SELECT count(t.user_id) cnt, u.name
FROM tasks t INNER JOIN users u ON u.id=t.user_id
GROUP BY t.user_id, u.name
HAVING count(t.user_id) > 1
答案 3 :(得分:0)
SELECT DISTINCT user.name
FROM USERS, TASKS AS task1, TASKS AS task2
WHERE USERS.ID = task1.user_id AND USERS.ID = task2.user_id AND task1.id <> task2.id;
这表示任务表与其自身在userid之间的连接,
task1.id&lt;&gt; task2.id限制只留下具有同一用户对的不同任务对的行,
与USERS的连接加入用户名,
并且DISTINCT过滤掉重复项。
如果您的DBMS在DISTINCT上遇到性能问题,那么:
(类型SELECT名称FROM USERS WHERE USERS.ID in(SELECT userid FROM TASKS task1 JOIN TASKS task2 ON ... WHERE);