查找每个人订单中的元素

问题描述 投票:0回答:2

有了这样的表,我需要为每个 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' '木头'
sql sqlite
2个回答
0
投票
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

0
投票

假设您有一个名为

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.

© www.soinside.com 2019 - 2024. All rights reserved.