1

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

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 种或更多,例如如何从目录中仅获取具有类型12 的行,所以如果它有 1 但没有 2 则不适合.

我在这里看到了一个类似的问题和决定,但是对于 SQL。使用了except,我尝试在mySQL 上用equals 替换它,但我不太了解mySQL。

提前谢谢你,对不起我的英语

4

1 回答 1

0

这种类型的查询称为“集合内集合”

如果您想获取具有两种类型(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

如果要确保您获得的目录 ID正好有两种类型(例如 1 和 2)

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;

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

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

| 目录 ID | TYPE_ID |
----------------------
| 1 | 1 |
| 1 | 2 |
| 2 | 1 |
| 2 | 3 |
| 2 | 4 |
| 3 | 1 |
| 3 | 2 |
| 3 | 4 |

上述查询的示例输出:

    查询 1 查询 2 查询 3

| 目录 ID | | 目录 ID | | 目录 ID |
-------------- -------------- --------------
| 1 | | 1 | | 1 |
| 3 | | 3 |

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

于 2013-08-15T19:36:25.460 回答