と呼ばれる独自の関係テーブルで、ラベルと企業の間に多対多の関係(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つの特定のラベルの醜い解決策を見つけました。このソリューションの問題は次のとおりです。
- それを動的に生成するための醜さ。
- 内部結合のwhere条件は、
Ftype
ofがと異なるか、とは異なるか、とは異なるかどうt0
かをチェックする必要があります。t1
t0
t2
t1
t2
- これらのクエリは、セットの
(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と2のすべての会社を検索します。
------- |Fcomp| ------- | 1 | | 2 | -------
ラベル1、2、3のすべての会社を検索しています。
------- |Fcomp| ------- | 1 | -------
これを読んでくれてありがとう、そしてこの問題へのあなたのアプローチを投稿するのを手伝ってくれてありがとう!