我在一个名为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)。查询还应该 - 尽可能好 - 在标签数量上是动态的,它应该适用于两个但也可能适用于十个给定标签。
我为两个或三个给定标签找到了一个丑陋的解决方案,发布在下面。这个解决方案的问题是:
- 动态生成它的丑陋。
- 内部连接的 where 条件必须检查
Ftype
oft0
是否与不同t1
、与t0
不同和t2
与t1
不同t2
。 - 这些查询生成集合的所有可能排列
(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 和 2 的所有公司:
------- |Fcomp| ------- | 1 | | 2 | -------
搜索标签为 1、2 和 3 的所有公司:
------- |Fcomp| ------- | 1 | -------
感谢您阅读本文,并感谢您帮助发布解决此问题的方法!