MySQL считает и присоединяется - PullRequest
2 голосов
/ 13 февраля 2011

Я создаю систему задач, которая имеет 4 таблицы:

задач

id | user_id | end_date
-------------------------
2  | 1       | 2011-02-10

пользователей

id | username
--------------
1  | johndoe
--------------
2  | janedoe

ролей

id | role_name
--------------
1  | coordinator

and tasks_roles_users

id | task_id | user_id | role_id
---------------------------------
1  | 2       | 2       | 1

У каждой задачи есть создатель (то есть: johndoe является владельцем задачи № 2), и у каждой задачи есть несколько пользователей с разными ролями в этой задаче, в моем примере «janedoe»координатор задачи № 2.Я застрял, пытаясь показать «janedoe» и «johndoe», сколько у них соответствующих заданий, и у меня возникла эта проблема, поскольку «johndoe» не играет роли в задании, он просто владелец задания.Так как я могу сказать, что у обоих есть 1 задание?

Ответы [ 4 ]

2 голосов
/ 13 февраля 2011

Вы можете сделать это, выполнив LEFT JOIN

SELECT u.id, u.username, 
    IFNULL(t.Cnt,0) OwnCount,
    IFNULL(tr.Cnt,0) RoleCount
    IFNULL(t.Cnt,0) + IFNULL(tr.Cnt,0) TotalCount
FROM users u LEFT JOIN (
    SELECT user_id, COUNT(*) cnt
    FROM tasks
    GROUP BY user_id
  ) t ON u.id = t.user_id
  LEFT JOIN (
    SELECT user_id, COUNT(*) cnt
    FROM tasks_roles_users
    GROUP BY user_id
  ) tr ON u.id = tr.user_id
WHERE t.user_id IS NOT NULL OR tr.user_id IS NOT NULL
0 голосов
/ 13 февраля 2011
SELECT COUNT(*) FROM tasks_roles_users WHERE user_id IN (SELECT id FROM users WHERE username = 'johndoe')
SELECT COUNT(*) FROM tasks_roles_users WHERE user_id IN (SELECT id FROM users WHERE username = 'janedoe')
0 голосов
/ 13 февраля 2011
SELECT COUNT(*) FROM tasks_roles_users WHERE user_id = "2"

Это позволит получить все задания, в которых "janedoe" находится в ролике.

Если не так много бросков (скажем, меньше 8), вы можете сохранить их как константы в своем коде, вместо того, чтобы делать запросы SQL для такой маленькой вещи.

define('ROLL_COORDINATOR', 1); // just an integer unique from other roll constants
0 голосов
/ 13 февраля 2011

Простой способ сделать это - добавить роль владельца и обращаться с ней как с любой другой ролью.Другой способ - использовать UNION.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...