Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 获取多对多关系中只有一个引用的行_Mysql_Many To Many_Relationship - Fatal编程技术网

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

我有三个具有多对多关系的MySQL表

一个表用于任务,另一个表用于用户,第三个表用于将任务分配给用户(每个任务可以分配给多个用户)

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


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

您需要将所有表连接在一起。使用以下命令显示分配给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";
这可能是由于两个原因:

  • MySQL允许在
    中使用
    子句进行非聚合引用
  • 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";