我正在构建一个有4个表的任务系统:
任务
id | user_id | end_date
-------------------------
2 | 1 | 2011-02-10
用户
id | username
--------------
1 | johndoe
--------------
2 | janedoe
角色
id | role_name
--------------
1 | coordinator
和tasks_roles_users
id | task_id | user_id | role_id
---------------------------------
1 | 2 | 2 | 1
每个任务都有一个创建者(即:johndoe是任务#2的所有者),每个任务都有几个用户在该任务上具有不同的角色,在我的例子中,“janedoe”是任务#2协调员。 我一直试图向“janedoe”和“johndoe”展示他们有多少应有的任务,而且我有这个问题,因为“johndoe”在任务中没有任务,他只是任务所有者。 那么我怎么能告诉他们两个任务到期?
答案 0 :(得分:2)
您可以通过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
答案 1 :(得分:0)
执行此操作的一种简单方法是添加所有者角色并将其视为任何其他角色。另一种方法是使用UNION
。
答案 2 :(得分:0)
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')
答案 3 :(得分:0)
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