Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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
Sql 从第二个表中选择与行集连接的行_Sql_Mysql_Database - Fatal编程技术网

Sql 从第二个表中选择与行集连接的行

Sql 从第二个表中选择与行集连接的行,sql,mysql,database,Sql,Mysql,Database,我有三张桌子: project (idproject, name) color (idcolor, name) project_has_color (idproject, idcolor) 现在,我需要选择与一组颜色相关的项目,例如:蓝色(1)、红色(2)、绿色(3): 为我提供与给定idcolor的一个或多个相关的项目,我需要与所有相关的项目-但我不知道如何实现这一点?这可能有效 SELECT p.idproject, p.name FROM project p JOIN project

我有三张桌子:

project (idproject, name)

color (idcolor, name)

project_has_color (idproject, idcolor)
现在,我需要选择与一组颜色相关的项目,例如:蓝色(1)、红色(2)、绿色(3):

为我提供与给定idcolor的一个或多个相关的项目,我需要与所有相关的项目-但我不知道如何实现这一点?

这可能有效

SELECT p.idproject, p.name
FROM project p JOIN project_has_color c USING (idproject)
WHERE c.idcolor IN (1,2,3)
HAVING count(*)=3;
前提是项目不能与颜色关联两次(即,(idproject,idcolor)是唯一的)。或

否则。

这可能会起作用

SELECT p.idproject, p.name
FROM project p JOIN project_has_color c USING (idproject)
WHERE c.idcolor IN (1,2,3)
HAVING count(*)=3;
前提是项目不能与颜色关联两次(即,(idproject,idcolor)是唯一的)。或


否则。

使用联接是最可靠的方法:

SELECT p.idproject, 
       p.name
  FROM PROJECT p
  JOIN PROJECT_HAS_COLOR phc ON phc.idproject = p.idproject
  JOIN COLOR c1 ON c1.idcolor = phc.idcolor
               AND c1.idcolor = 1
  JOIN COLOR c2 ON c2.idcolor = phc.idcolor
               AND c2.idcolor = 2
  JOIN COLOR c3 ON c3.idcolor = phc.idcolor
               AND c3.idcolor = 3
使用:

  SELECT p.idproject, 
         p.name
    FROM PROJECT p
    JOIN PROJECT_HAS_COLOR phc ON phc.idproject = p.idproject
    JOIN COLOR c ON c.idcolor = phc.idcolor
   WHERE c.idcolor IN (1, 2, 3)
GROUP BY p.idproject, p.name
  HAVING COUNT(*) = 3

…依赖于您的数据模型阻止
idcolor
值多次与项目关联。您不能在MySQL中使用
HAVING COUNT(DISTINCT*)
,因此相同项目的2+关系复制
idcolor
值将返回误报。

使用联接是最可靠的方法:

SELECT p.idproject, 
       p.name
  FROM PROJECT p
  JOIN PROJECT_HAS_COLOR phc ON phc.idproject = p.idproject
  JOIN COLOR c1 ON c1.idcolor = phc.idcolor
               AND c1.idcolor = 1
  JOIN COLOR c2 ON c2.idcolor = phc.idcolor
               AND c2.idcolor = 2
  JOIN COLOR c3 ON c3.idcolor = phc.idcolor
               AND c3.idcolor = 3
使用:

  SELECT p.idproject, 
         p.name
    FROM PROJECT p
    JOIN PROJECT_HAS_COLOR phc ON phc.idproject = p.idproject
    JOIN COLOR c ON c.idcolor = phc.idcolor
   WHERE c.idcolor IN (1, 2, 3)
GROUP BY p.idproject, p.name
  HAVING COUNT(*) = 3

…依赖于您的数据模型阻止
idcolor
值多次与项目关联。您不能在MySQL中使用
HAVING COUNT(DISTINCT*)
,因此相同项目的2+关系复制
idcolor
值将返回误报。

查询计划是什么样子的?感谢您提供的线索-最后,我只使用了2个表,它作为一组联接:“联接项目\u的颜色c1为开。”(c1.idproject=p.idproject和c1.idcolor=1)JOIN project_的颜色c2为开(c2.idproject=p.idproject和c2.idcolor=2)……查询计划会是什么样子?感谢这个线索-最后我只使用了两个表,它作为一组JOIN:“JOIN project_的颜色c1为开(c1.idproject=p.idproject和c1.idcolor=1)JOIN project_的颜色c2为开。”(c2.idproject=p.idproject和c2.idcolor=2)