2

我正在处理应该返回产品代码或变体代码的查询,如果有一个连接并通过在产品表中找到的修改属性(以选择最近修改的产品)对它们进行排序。有我的查询:

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?

4

2 回答 2

0

假设

  • 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;
于 2013-03-01T08:54:11.943 回答
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;

感谢您尝试帮助我解决这个问题!

于 2013-03-04T05:05:15.557 回答