【问题标题】:Returning distinct records based on left join根据左连接返回不同的记录
【发布时间】:2014-10-14 17:05:42
【问题描述】:

我在编写复杂的 SQL 查询时遇到了一些麻烦。我得到了我正在寻找的结果并且性能很好,但是每当我尝试为 product_groups 的 LEFT JOIN 抓取不同的行时,我要么遇到一些性能问题,要么得到不正确的结果。

这是我的查询:

 SELECT
    pl.name, pl.description,
    p.rows, p.columns,
    pr.sku,
    m.filename, m.ext, m.type,
    ptg.product_group_id AS group,
 FROM
    product_region AS pr
 INNER JOIN
    products AS p ON (p.product_id = pr.product_id)
 INNER JOIN
    media AS m ON (p.media = m.media_id)
 INNER JOIN
    product_language AS pl ON (p.product_id = pl.product_id)
 LEFT JOIN
    products_groups AS ptg ON (ptg.product_id = pr.product_id)
 WHERE
    (pl.lang = :lang) AND
    (pr.region = :region) AND
    (pt.product_id = p.product_id)
 GROUP BY
    p.product_id
 LIMIT
    :offset, :limit

我得到的结果是正确的,但是我只想为“组”返回不同的行。例如,我返回了许多具有相同“组”值的结果,但我只希望显示第一行,并省略以下具有相同组值的记录。

我尝试了 GROUP BY group 和 DISTINCT,但结果不正确。另请注意,组可以返回为 NULL,我不希望这些行受到影响。

提前致谢。

【问题讨论】:

  • 你能给我们看一些数据吗?请阅读MY POST 询问 sql 问题...关于格式化 ascii 表的最佳实践和方法的提示和技巧.. 可能会有所帮助
  • 如果您不关心返回哪一行,您可以使用GROUP BY ptg. product_group_id 而不是GROUP BY p.product_id。不过,您使用的是 MySQL 扩展,这显然是不受欢迎的 (dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html)。
  • 我试过了,由于某种原因它错误地将空值分组......

标签: mysql


【解决方案1】:

我在发布此消息一小时后制定了解决方案。我的目标是先按 product_group_id 分组,然后再按单个 product_id 分组。要求是我将消除产品重复并让一个产品代表组集。

我最终使用了 COALESCE(ptg.product_group_id, p.product_id)。这解释了我的大多数组 ID 都是空的,除了一些分散的产品。在使用 COALESCE 时,我首先按组 ID 进行分组,如果该值为 null,它将忽略该组并按 product_id 收集。

【讨论】:

    猜你喜欢
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多