基于左连接返回不同的记录

时间:2014-10-14 17:05:43

标签: mysql

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

这是我的疑问:

 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”返回不同的行。例如,我得到了许多具有相同“组”值的结果,但我只希望显示第一行,并且要删除具有相同组值的以下记录。

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

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