mysql - SQL 与 If 不同

标签 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?

最佳答案

假设

  • 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/

相关文章:

python - 简化许多 if 语句

php - 如何根据两个表中的字段对结果集进行排序

mysql - 选择sql中在一个属性上具有最大值且小于另一属性的记录

php - 使用 mysql 和 php 创建多个 csv 文件

mysql - 通过从每条记录中减去 4 小时来更新时间戳值

mysql - 从具有双分组依据的查询中获取 0 的计数

mysql - 根据一个字段从表中获取数据的SELECT语句

PHP备份数据库并发送电子邮件

php - bind_param 错误,其中提供了正确数量的参数?

objective-c - 使用 Objective-C 中的 If 语句根据数值设置 UITextfield 的颜色