Mysql 获取多对多关系中只有一个引用的行
我有三个具有多对多关系的MySQL表 一个表用于任务,另一个表用于用户,第三个表用于将任务分配给用户(每个任务可以分配给多个用户) 如何将任务仅分配给一个用户Mysql 获取多对多关系中只有一个引用的行,mysql,many-to-many,relationship,Mysql,Many To Many,Relationship,我有三个具有多对多关系的MySQL表 一个表用于任务,另一个表用于用户,第三个表用于将任务分配给用户(每个任务可以分配给多个用户) 如何将任务仅分配给一个用户 如何将任务仅分配给一个特定用户?您需要将所有表连接在一起。使用以下命令显示分配给John的所有任务: SELECT name,title FROM users JOIN assigned ON (user_id=users.id) JOIN tasks ON (tasks.id=task_id) WHERE name="John"; 使
如何将任务仅分配给一个特定用户?您需要将所有表连接在一起。使用以下命令显示分配给John的所有任务:
SELECT name,title
FROM users
JOIN assigned ON (user_id=users.id)
JOIN tasks ON (tasks.id=task_id)
WHERE name="John";
使用groupby
和HAVING
查看仅分配给一个用户的所有任务
SELECT title
FROM tasks
JOIN assigned ON (task_id=id)
GROUP BY id
HAVING count(*) = 1;
在后者中,您不一定需要知道任务分配给了谁,只需要知道它们只分配给了一个用户。因此,您不需要加入用户
表
更新:
您可以使用以下命令查找单独分配给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";
这可能是由于两个原因:
中使用
子句进行非聚合引用COUNT(*)=1
强制name
为单个值-即,您不会处于name
同时包含“John”和“Mike”的情况如果将连接另一个表(例如,包含每个任务注释的表),则查询将无法按预期工作。为了使其始终按预期工作,HAVING condition应该从精确的列中计算COUNT,例如:
HAVING COUNT(DISTINCT user_id)=1和name=“John”
True,如果将同一用户多次分配到同一任务,则失败。从语义上讲,这没有多大意义,通过在“已分配”表中将(task\u id,user\u id)声明为唯一来避免它是值得的。当然,如果id在“users”或“tasks”表中不是唯一的,也可能发生同样的情况。正如我前面提到的,如果加入另一个表并选择其列,则它将失败,因为它们会干扰计数(*)。它与分配的中的非唯一用户ID无关。当然,可以并且将会有非唯一的用户ID,例如在带有用户注释的表中。
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";