0

我不是 SQL 专家,但我不是一个完全的业余爱好者,但这是对一个包含 2 个字段的单个表的查询,我不知道如何处理。

假设您有一张桌子,上面有班级# 和学生#。您如何找到只有学生 x、y 和 z 的班级?

我真正的问题更像是一个目录和项目编号表,以及如何找到所有具有(或多或少)指定项目的目录。

我唯一的想法是围绕 GROUP_CONCAT 进行匹配,但必须有 b731e 一种更优雅的方式......

编辑:我错误地陈述了这个问题,所以我也会提供表结构。这个问题更像是装在盒子里的产品,一个盒子可能包含多个特定产品,而您希望找到具有完全指定内容的盒子。因此,例如,该表是:

+------------+------------+------+-----+---------+----------------+
| Field      | Type       | Null | Key | Default | Extra          |
+------------+------------+------+-----+---------+----------------+
| id         | bigint(20) | NO   | PRI | NULL    | auto_increment |
| box_id     | bigint(20) | YES  |     | NULL    |                |
| product_id | bigint(20) | YES  | MUL | NULL    |                |
+------------+------------+------+-----+---------+----------------+

我想找到所有包含 2 件产品 ID 22、17 件和 55 件的盒子。不多也不少。

4

2 回答 2

2

你可以使用一个having子句:

select  *
from    YourTable
group by
        class
having  count(distinct student) = 3
        and max(case when student = 'X' then 1 end) = 1
        and max(case when student = 'Y' then 1 end) = 1
        and max(case when student = 'Z' then 1 end) = 1
于 2012-06-30T15:35:36.697 回答
0

我确实有一个可行的答案,但它远非高效或优雅,因此我将它呈现给任何寻求该问题的次优但正确解决方案的人,并诱使其他人提供更好的解决方案。

SELECT box_id, GROUP_CONCAT( product_id
ORDER BY product_id DESC 
SEPARATOR  ',' ) AS contents
FROM box_product
GROUP BY box_id
HAVING contents =  '17,22,22,55';
于 2012-10-05T03:26:20.113 回答