在多对多关系中获取只有一个引用的行

时间:2014-04-17 14:19:44

标签: mysql many-to-many relationship

我有三个具有多对多关系的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    |
                                   +---------+---------+

如何将任务分配给一个用户?

如何将任务分配给仅一个特定用户?

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 BYHAVING查看仅分配给一个用户的所有任务。

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";

这可能是由于两个原因:

  1. MySQL允许HAVING子句中的非聚合引用。
  2. COUNT(*)=1强制name成为单一价值 - 即您不会处于name同时拥有'John'和'Mike'的情况。