0

と呼ばれる独自の関係テーブルで、ラベルと企業の間に多対多の関係(MySQL)があります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。そのような会社がデータベースにある場合、テーブルには3つの行がありRELcomplabel、すべて同じFcompですが異なるFlabel(1、2、および3)。クエリは、ラベルの数も可能な限り動的である必要があります。2つだけでなく、10個のラベルに対しても機能する必要があります。

以下に投稿されている、2つまたは3つの特定のラベルの醜い解決策を見つけました。このソリューションの問題は次のとおりです。

  1. それを動的に生成するための醜さ。
  2. 内部結合のwhere条件は、Ftypeofがと異なるか、とは異なるか、とは異なるかどうt0かをチェックする必要があります。t1t0t2t1t2
  3. これらのクエリは、セットの(1,2,3)1つを選択するだけで、セットのすべての可能な順列を生成します。

2つのラベルの解決策:

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;

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

あなたの質問に答えるためのsqlfiddlehttp://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 に答える