0

我在一个名为RELcomplabel. 它基本上看起来像这样:

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 条件必须检查Ftypeoft0是否与不同t1、与t0不同和t2t1不同t2
  3. 这些查询生成集合的所有可能排列(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;

三个标签的解决方案:

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;

例如,使用这个测试数据:

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

我正在搜索一个给出类似结果的查询

  1. 搜索标签为 1 和 2 的所有公司:

    -------
    |Fcomp|
    -------
    | 1   |
    | 2   |
    -------
    
  2. 搜索标签为 1、2 和 3 的所有公司:

    -------
    |Fcomp|
    -------
    | 1   |
    -------
    

感谢您阅读本文,并感谢您帮助发布解决此问题的方法!

4

1 回答 1

3

一个 sqlfiddle 来回答你的问题http://sqlfiddle.com/#!2/2711e/4

编辑:添加 SQL 以防小提琴消失:

SELECT Fcomp
FROM RELcomplabel
WHERE Flabel IN (1, 2, 3)
GROUP BY Fcomp
HAVING COUNT(Flabel) >= 3
于 2012-10-07T17:06:40.203 回答