首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL:在条件集多到多的关系表上进行选择

MySQL:在条件集多到多的关系表上进行选择
EN

Stack Overflow用户
提问于 2012-10-06 14:11:18
回答 1查看 1.1K关注 0票数 0

我在标签和公司之间有一个多对多的关系(MySQL),在一个叫做RELcomplabel的关系表中。基本上是这样的:

代码语言:javascript
运行
复制
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)。查询也应该--尽可能好--在标签数量上是动态的,它应该工作在两个标签上,但对于给定的标签也应该是10个。

我找到了一个丑陋的解决方案,两个或三个给定的标签,张贴在下面。这一解决办法的问题是:

  1. 动态生成它的丑陋。
  2. 内部连接的位置条件必须检查Ftype of t0t1是否不同,t0是否与t2不同,t1是否与t2不同。
  3. 这些查询生成集合(1,2,3)的所有可能排列,只需选择其中之一。

两个标签的解决方案:

代码语言:javascript
运行
复制
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;

三个标签的解决方案:

代码语言:javascript
运行
复制
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;

例如,,使用这个testdata:

代码语言:javascript
运行
复制
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的公司:
  2. 搜寻所有标签为1、2及3的公司:

感谢您阅读这篇文章,并感谢您帮助发布您解决这个问题的方法!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-07 17:06:40

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

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

代码语言:javascript
运行
复制
SELECT Fcomp
FROM RELcomplabel
WHERE Flabel IN (1, 2, 3)
GROUP BY Fcomp
HAVING COUNT(Flabel) >= 3
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12760536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档