【问题标题】:Find elements that are found in every person order查找在每个人订单中找到的元素
【发布时间】:2023-02-26 07:59:33
【问题描述】:

有了这样的表,我需要为每个 ID 编写 SQL 查询来查找每个订单中特定 ID 的那些材料

ID ORDER_ID MATERIAL
'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'

结果必须是:

ID MATERIAL
'ID1' 'wood'
'ID1' 'gold'
'ID1' 'obsidian'
'ID2' 'glass'
'ID2' 'sandstone'
'ID2' 'wood'

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:
    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
    

    【讨论】:

      【解决方案2】:

      假设您有一个名为 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 子句按 IDMATERIAL 对数据进行分组,并使用 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 MATERIAL
      ID1 gold
      ID1 obsidian
      ID1 wood
      ID2 glass
      ID2 sandstone
      ID2 wood

      试试SQL Fiddle

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-22
        相关资源
        最近更新 更多