如何确定具有两个或更多任务的用户的名称?

时间:2011-04-21 02:34:38

标签: sql database

如果我有以下表格

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

4 个答案:

答案 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上遇到性能问题,那么:

  • 获得更好的DBMS
  • 将查询重写为相关子查询

(类型SELECT名称FROM USERS WHERE USERS.ID in(SELECT userid FROM TASKS task1 JOIN TASKS task2 ON ... WHERE);