我正在处理应该返回产品代码或变体代码的查询,如果有一个连接并按产品表中找到的修改属性(选择最近修改的产品)对它们进行排序。有我的查询:
SELECT IF(Length(variation_code) > 0, variation_code, prod_code) AS prod_code,
product.modified,
price
FROM product
LEFT JOIN variation_row
ON product.prod_code = variation_row.product_code
WHERE prod_code IN (SELECT prod_code
FROM product)
AND price > 0
GROUP BY prod_code
ORDER BY modified DESC
LIMIT 6
问题是,如果同一产品连续修改多次,它可能会多次出现在结果集中。
我知道 DISTINCT 仅用于获取与其他值不同的值,但我无法将其实现到我的查询中,因为 IF 用于获取 prod_code。
有什么方法可以修改我的脚本,使其返回相同的结果但具有不同的 prod_codes?
最佳答案
假设
- product.modified 是一个日期
- product.modified 和product.prod_code 在产品中是唯一的
- product.price 取决于这两个属性
- 您想获取每个 prod_code 的最新修改条目
那么我的建议是
SELECT S.prod_code
, S.modified
, P.price
FROM product P
INNER JOIN
(SELECT case
when Length(variation_code) > 0 then variation_code
else prod_code
end AS prod_code
, -- use the most recent modification
max(product.modified) as modified
FROM product
LEFT JOIN
variation_row
ON product.prod_code = variation_row.product_code
WHERE product.price > 0
GROUP BY
case
when Length(variation_code) > 0 then variation_code
else prod_code
end
) S
on S.prod_code = P.prod_code
and S.modified = P.modified;
这应该适用于 Oracle、SQL Server 和 PostgresSQL。不知道您的数据库产品(您使用哪个?)是否支持这种语法?
阅读原始答案的前两条评论后进行编辑
这有帮助吗
select IF(Length(variation_code) > 0, variation_code, prod_code) AS prod_code
, p.modified
, p.price
from product p
inner join
(select m.prod_code
, max(m.modified) as modified
from product m
group by
m.prod_code
) m
on p.prod_code = m.prod_code
and p.modified = m.modified
left join
variation_row v
on v.product_code = p.prod_code
order by
p.modified desc
limit 6;
关于mysql - SQL 与 If 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15153323/