MySQL:在多对多关系表中选择一组条件

时间:2012-10-06 14:11:19

标签: mysql select many-to-many

我在一个名为RELcomplabel的关系表中的标签和公司之间存在多对多关系(MySQL)。它基本上是这样的:

CREATE TABLE `RELcomplabel` (
    `IDcomplabel` INT NOT NULL AUTO_INCREMENT ,
    PRIMARY KEY (`IDcomplabel`),
    `Fcomp` INT NOT NULL ,
    `Flabel` INT NOT NULL
 );

现在我想选择至少拥有一组给定标签的所有公司(我想要的只是Fcomp),例如Flabel = 1 AND Flabel = 2 AND Flabel = 3。如果这样的公司在数据库中,则表RELcomplabel中有三行,它们都具有相同的Fcomp但不同的Flabel(1,2和3)。查询也应该 - 尽可能 - 在标签数量上是动态的,它应该适用于两个,但也可能适用于十个给定的标签。

我发现了两个或三个给定标签的丑陋解决方案,如下所示。这个解决方案的问题是:

  1. 动态生成它的丑陋。
  2. 内部联接的where-conditions必须检查Ftype t0t1是否不同,t0t2和{{{0}}不同1}}与t1不同。
  3. 这些查询会生成集合t2的所有可能排列,只是为了选择其中一个。
  4. 两个标签的解决方案:

    (1,2,3)

    三种标签的解决方案:

    SELECT s.fcomp FROM
    (
        SELECT
            t0.fcomp,
            t0.ftype AS type0,
            t1.ftype AS type1
        FROM
            RELcomplabel AS t0
        INNER JOIN 
            RELcomplabel AS t1
            ON t0.fcomp = t1.fcomp
        WHERE
            t0.ftype <> t1.ftype
    ) AS s
    WHERE
        s.type0 = 2
        AND s.type1 = 3;
    

    例如,使用此testdata:

    SELECT s.fcomp FROM
    (
        SELECT
            t0.fcomp,
            t0.ftype AS type0,
            t1.ftype AS type1,
            t2.ftype AS type2
        FROM
            RELcomplabel AS t0
        INNER JOIN 
            RELcomplabel AS t1
            ON t0.fcomp = t1.fcomp
        INNER JOIN
            RELcomplabel AS t2
            ON t0.fcomp = t2.fcomp
        WHERE
            t0.ftype <> t1.ftype
            AND t0.ftype <> t2.ftype
            AND t1.ftype <> t2.ftype
    ) AS s
    WHERE
        s.type0 = 1
        AND s.type1 = 2
        AND s.type2 = 3;
    

    我正在搜索提供结果的查询,例如

    1. 搜索所有标有1&amp;标签的公司2:

      INSERT INTO `relcomplabel` (`IDcomplabel`,`Fcomp`,`Flabel`) VALUES (1,1,1);
      INSERT INTO `relcomplabel` (`IDcomplabel`,`Fcomp`,`Flabel`) VALUES (2,1,2);
      INSERT INTO `relcomplabel` (`IDcomplabel`,`Fcomp`,`Flabel`) VALUES (3,1,3);
      INSERT INTO `relcomplabel` (`IDcomplabel`,`Fcomp`,`Flabel`) VALUES (4,2,2);
      INSERT INTO `relcomplabel` (`IDcomplabel`,`Fcomp`,`Flabel`) VALUES (5,2,3);
      
    2. 搜索所有带有标签1,2和2的公司。 3:

      -------
      |Fcomp|
      -------
      | 1   |
      | 2   |
      -------
      
    3. 感谢您阅读本文,感谢您帮助发布您解决此问题的方法!

1 个答案:

答案 0 :(得分:3)

回答您的问题的http://sqlfiddle.com/#!2/2711e/4

编辑: 在小提琴消失的情况下添加了SQL:

SELECT Fcomp
FROM RELcomplabel
WHERE Flabel IN (1, 2, 3)
GROUP BY Fcomp
HAVING COUNT(Flabel) >= 3