我在制定复杂的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,我不希望这些行受影响。
提前致谢。
答案 0 :(得分:0)
我在发布此消息后一小时制定了解决方案。我的目标是先按product_group_id分组,然后再按照product_id分组。要求是我会消除产品重复,并让一个产品代表集合。
我最终使用了COALESCE(ptg.product_group_id,p.product_id)。这说明我的大多数组ID都是空的,除了一些分散的产品。在使用COALESCE时,我首先按组ID进行分组,如果该值为null,则忽略该组并按product_id进行收集。