SQL与If不同

时间:2013-03-01 08:16:53

标签: mysql sql if-statement distinct

我正在使用应该返回产品代码的查询,或者如果已连接产品代码,则使用变体代码,并按产品表中的修改属性(以选择最新修改的产品)对其进行排序。有我的疑问:

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?

2 个答案:

答案 0 :(得分: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;

答案 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;

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