如何仅选择与多对多中的所有参数匹配的内容

时间:2013-08-15 19:31:48

标签: mysql

只需获得与多对多关系中所有指定条件匹配的记录。 大大简化的表格看起来像

Catalog     Catalog_Types           Types
   1            1  1                  1
   2            1  2                  2
   3            2  1                  3
                2  3                  4
                2  4
                3  1
                3  4

很容易从目录中选择1种类型,但我需要选择1个以上,例如如何从目录中获取只有那些拥有类型 1 2,所以如果它有1但没有2则不合适。

我在这里看到了类似的问题和决定,但对于SQL。除了之外,我试图在mySQL上用equals替换它,但我不太了解mySQL。

提前谢谢你, 抱歉我的英文

1 个答案:

答案 0 :(得分:0)

此类查询称为“set in set”

如果要获取具有两种类型(1和2)但可能具有其他类型的目录ID

SELECT catalog_id
  FROM catalog_type
 WHERE type_id IN (1, 2)
GROUP BY catalog_id
HAVING COUNT(DISTINCT type_id) = 2

如果想确保使用两种类型(例如1和2)

获取目录ID
SELECT catalog_id
  FROM catalog_type
GROUP BY catalog_id
HAVING SUM(type_id = 1) > 0
   AND SUM(type_id = 2) > 0
   AND COUNT(DISTINCT type_id) = 2;

如果您想获取三种类型中的至少两种(例如1,2,4)的目录ID

SELECT catalog_id
  FROM catalog_type
 WHERE type_id IN (1, 2)
GROUP BY catalog_id
HAVING (MAX(type_id = 1)
      + MAX(type_id = 2)
      + MAX(type_id = 4)) >= 2

假设您在catalog_type

中有关注
| CATALOG_ID | TYPE_ID |
------------------------
|          1 |       1 |
|          1 |       2 |
|          2 |       1 |
|          2 |       3 |
|          2 |       4 |
|          3 |       1 |
|          3 |       2 |
|          3 |       4 |

上述查询的示例输出:

    query 1        query 2         query 3

| CATALOG_ID |  | CATALOG_ID |  | CATALOG_ID |
--------------  --------------  --------------
|          1 |  |          1 |  |          1 |
|          3 |                  |          3 |

以下是所有这些查询的 SQLFiddle 演示。看看结果如何不同。