我正在使用应该返回产品代码的查询,或者如果已连接产品代码,则使用变体代码,并按产品表中的修改属性(以选择最新修改的产品)对其进行排序。有我的疑问:
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?
答案 0 :(得分:0)
假设
然后我的建议是
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;
答案 1 :(得分:0)
我设法自己创建了一个解决方案。不知道这是否是最有效的方法,但它有效:
SELECT DISTINCT prod_code FROM (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) AS a LIMIT 6;
感谢您帮我解决这个问题!