有了这样的表,我需要为每个 ID 编写 SQL 查询来查找特定 ID 的每个订单中的那些材料
ID | 订单号 | 材质 |
---|---|---|
'ID1' | 12 | '木头' |
'ID1' | 12 | '黄金' |
'ID1' | 12 | 黑曜石' |
'ID1' | 68 | '木头' |
'ID1' | 68 | '黄金' |
'ID1' | 68 | '黑曜石' |
'ID1' | 68 | 基岩' |
'ID2' | 138 | '玻璃' |
'ID2' | 138 | '砂岩' |
'ID2' | 138 | '木头' |
'ID2' | 139 | '玻璃' |
'ID2' | 139 | '砂岩' |
'ID2' | 139 | '木头' |
'ID2' | 139 | “混凝土” |
结果必须是:
ID | 材质 |
---|---|
'ID1' | '木头' |
'ID1' | '黄金' |
'ID1' | '黑曜石' |
'ID2' | '玻璃' |
'ID2' | '砂岩' |
'ID2' | '木头' |
select m.ID, m.MATERIAL
from (
select id, MATERIAL, count(*) c
from table
group by id, MATERIAL
)m
inner join (
select id, count(distinct ORDER_ID) c
from table
group by ID
)o
on o.ID = m.ID
and o.c = m.c
假设您有一个名为
orders
的表,其架构使用如下内容构建:
CREATE TABLE IF NOT EXISTS orders (
`ID` VARCHAR(5) CHARACTER SET utf8,
`ORDER_ID` INT,
`MATERIAL` VARCHAR(11) CHARACTER SET utf8
);
INSERT INTO orders VALUES
('ID1',12,'wood'),
('ID1',12,'gold'),
('ID1',12,'obsidian'),
('ID1',68,'wood'),
('ID1',68,'gold'),
('ID1',68,'obsidian'),
('ID1',68,'bedrock'),
('ID2',138,'glass'),
('ID2',138,'sandstone'),
('ID2',138,'wood'),
('ID2',139,'glass'),
('ID2',139,'sandstone'),
('ID2',139,'wood'),
('ID2',139,'concrete');
您可以使用 GROUP BY 子句按
ID
和 MATERIAL
对数据进行分组,并使用 HAVING
子句按不同 ORDER_ID
值的数量过滤组:
SELECT ID, MATERIAL
FROM Orders o1
GROUP BY ID, MATERIAL
HAVING COUNT(DISTINCT ORDER_ID) = (
SELECT COUNT(DISTINCT ORDER_ID)
FROM Orders o2
WHERE o2.ID = o1.ID
)
输出:
ID | 材质 |
---|---|
ID1 | 黄金 |
ID1 | 黑曜石 |
ID1 | 木头 |
ID2 | 玻璃 |
ID2 | 砂岩 |
ID2 | 木头 |
试试 SQL Fiddle.