我有三个具有多对多关系的MySQL表。
一个表用于任务,另一个表用于用户,第三个表用于向用户分配任务(每个任务可以分配给多个用户)。
users: tasks: assigned:
+----+------+ +----+-------+ +---------+---------+
| id | name | | id | title | | task_id | user_id |
+----+------+ +----+-------+ +---------+---------+
| 1 | John | | 1 | One | | 1 | 1 |
+----+------+ +----+-------+ +---------+---------+
| 2 | Mike | | 2 | Two | | 1 | 2 |
+----+------+ +----+-------+ +---------+---------+
| 2 | 1 |
+---------+---------+
如何将任务分配给一个用户?
如何将任务分配给仅一个特定用户?
答案 0 :(得分:1)
您需要将所有表连接在一起。使用以下命令显示分配给John的所有任务:
SELECT name,title
FROM users
JOIN assigned ON (user_id=users.id)
JOIN tasks ON (tasks.id=task_id)
WHERE name="John";
使用GROUP BY
和HAVING
查看仅分配给一个用户的所有任务。
SELECT title
FROM tasks
JOIN assigned ON (task_id=id)
GROUP BY id
HAVING count(*) = 1;
在后者中,您不一定需要知道分配了哪些任务,只是将它们分配给一个用户。因此,您无需加入users
表。
更新
您可以使用以下内容查找分配给John的任务:
SELECT name,title
FROM tasks
JOIN assigned ON (task_id=tasks.id)
JOIN users ON (user_id=users.id)
GROUP BY tasks.id
HAVING COUNT(*) = 1 and name="John";
这可能是由于两个原因:
HAVING
子句中的非聚合引用。COUNT(*)=1
强制name
成为单一价值 - 即您不会处于name
同时拥有'John'和'Mike'的情况。