【问题标题】:MySQL subquery pulls multiple resultsMySQL 子查询拉取多个结果
【发布时间】:2014-07-17 18:16:20
【问题描述】:

我有不同 'manufacturer' 字段的重复记录。我正在尝试GROUP BY i.stocknumber,但这只会删除一条记录而不会收集其他制造商的结果。

有些记录有一个NULL 制造商字段,我尝试在子查询中使用GROUP_CONCAT 来省略“制造商”的不同结果。

这是我当前的查询:

SELECT i.id,i.stocknumber,m.manufacturer
FROM inventory i
INNER JOIN makes mk on i.make = mk.id 
INNER JOIN models md on i.model = md.id 
INNER JOIN classes cl on i.class = cl.id 
LEFT JOIN ( 
            SELECT idm.id, idm.inventory_id, dm.manufacturer AS 'manufacturer' 
            FROM display_manufacturers dm 
            INNER JOIN inventory_display_manufacturers idm ON dm.id = idm.display_manufacturer_id 
           ) m ON i.id = m.inventory_id 
-- GROUP BY i.stocknumber
ORDER BY i.stocknumber

我得到的结果是:

对通过连接manufacturer 字段对重复记录进行分组有什么想法吗?

注意:我已经在子查询中尝试过GROUP_CONCAT

预期结果:

id   | stocknumber | manufacturer
----------------------------------
946  | 011A        | NULL
907  | 1001        | Sports Coach, Coachmen
1032 | 1001x       | Sports Coach

等等……

【问题讨论】:

  • 您在主查询中尝试过GROUP_CONCAT 吗?
  • 为什么要将制造商的列表串联在一起?这里的最终游戏是什么?如果您追求唯一的库存编号和制造商,那么您的查询就在现场。如果您只需要一个唯一库存编号列表,请排除制造商...我还没有看到真正的问题...
  • 查看所需结果的编辑。
  • 我认为@Gordon 已经完成了你所追求的。只要确保您的 group by 没有被注释掉

标签: php mysql subquery group-concat


【解决方案1】:

你在找这个吗?

SELECT i.id, i.stocknumber, group_concat(distinct m.manufacturer) as manufacturers
. . .
GROUP BY i.stocknumber

编辑:

此版本明确将您的查询用作子查询。不应将所有制造商放在同一行:

select stocknumber, group_concat(distinct manufacturer) as manufacturers
from (SELECT i.id,i.stocknumber,m.manufacturer
      FROM inventory i
      INNER JOIN makes mk on i.make = mk.id 
      INNER JOIN models md on i.model = md.id 
      INNER JOIN classes cl on i.class = cl.id 
      LEFT JOIN ( 
            SELECT idm.id, idm.inventory_id, dm.manufacturer AS 'manufacturer' 
            FROM display_manufacturers dm 
            INNER JOIN inventory_display_manufacturers idm ON dm.id = idm.display_manufacturer_id 
           ) m ON i.id = m.inventory_id
     ) t
GROUP BY stocknumber ;

【讨论】:

  • 如果我在主查询中输入GROUP_CONCAT,它会拉取所有制造商并为所有记录填写制造商字段。
  • @gtr1971 。 . .这不是你想要的吗?
  • 它正在抓取表中的所有制造商,而不仅仅是属于记录的制造商。
  • @gtr1971 。 . .您是否添加了group by 子句?假设连接条件是正确的(我假设这是因为它会产生您的输出),它应该只在每一行上包含特定 stocknumber 的制造商。
【解决方案2】:

如果您要删除 NULL 字段,则只需添加一个 WHERE 条件,不包括 NULL 字段

SELECT i.id,i.stocknumber,m.manufacturer
FROM inventory i
INNER JOIN makes mk on i.make = mk.id 
INNER JOIN models md on i.model = md.id 
INNER JOIN classes cl on i.class = cl.id 
LEFT JOIN ( 
            SELECT idm.id, idm.inventory_id, dm.manufacturer AS 'manufacturer' 
            FROM display_manufacturers dm 
            INNER JOIN inventory_display_manufacturers idm ON dm.id = idm.display_manufacturer_id 
           ) m ON i.id = m.inventory_id 
WHERE m.manufacturer IS NOT NULL
-- GROUP BY i.stocknumber
ORDER BY i.stocknumber

【讨论】:

  • 为什么要用where?只需将查询更改为内部联接。如果“右边”没有匹配的记录,左连接将返回空值。内部连接不会
  • 我想要 NULLS,只是想在该领域中只获得相应的制造商。空值没问题。
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多