как я могу определить имена пользователей, у которых есть две или более задач? - PullRequest
0 голосов
/ 21 апреля 2011

Если у меня есть следующие таблицы

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 ]

2 голосов
/ 21 апреля 2011
  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
0 голосов
/ 21 апреля 2011

SELECT DISTINCT user.name<BR> FROM USERS, TASKS AS task1, TASKS AS task2<BR> WHERE USERS.ID = task1.user_id AND USERS.ID = task2.user_id AND task1.id <> task2.id;

Это представляет собой соединение таблицы задач с самим собой по идентификатору пользователя,
Ограничение task1.id <> task2.id оставляет только строки с парами разных задач, которые были у одного и того же пользователя,
Объединение с ПОЛЬЗОВАТЕЛЯМИ объединяет имя пользователя,
И DISTINCT отфильтровывает дубликаты.

Если ваша СУБД создает проблемы с производительностью по сравнению с DISTINCT, то:

  • получи лучшую СУБД
  • переписать запрос как коррелированный подзапрос

(жанр ВЫБЕРИТЕ имя ОТ ПОЛЬЗОВАТЕЛЕЙ, ГДЕ USERS.ID в (ВЫБЕРИТЕ ИДЕНТИФИКАТОР ОТ ЗАДАЧ ЗАДАЧА1 СОЕДИНЕННЫЕ ЗАДАЧИ задача2 ВКЛ ... ГДЕ);

0 голосов
/ 21 апреля 2011
  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
0 голосов
/ 21 апреля 2011
    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...