在WHERE中使用IF语句的Mysql查询?

标签 mysql

我正在尝试解决这个问题,但找不到正确的解决方案...我想做什么?

现在我要加入主要产品及其最便宜的变体。但我需要编辑我的查询来做到这一点: 每个变体都有 quantity_in_stock。如果所有变体都有 quantity_in_stock == 0,选择最便宜的,如果有任何变体 quantity_in_stock > 0,选择最便宜的 quantity_in_stock > 0

这是代码示例,我需要在其中使用它:

$query = 'LEFT JOIN (
                     SELECT id_product_variant, price AS price, main_product_id FROM ' . $this->products_v_table . ' 
                           ORDER BY price ASC
                     ) as t1 ON t1.main_product_id = ' . $this->table_name . '.id_product ';

你有什么想法,如何去做?谢谢你的帖子:)

最佳答案

您应该从一个子查询开始,该子查询将为您提供您为每个 main_product_id 指定的最低价格。这就是使用 COALESCE() 从其参数列表中获取第一个非 NULL 项的技巧。

COALESCE() 的第一个参数是 MIN(IF(quantity_in_stock>0,price,NULL))。如果不存在具有相应正数量值的价格值,这将返回 null。

第二个参数是 MIN(IF(quantity_in_stock=0,price,NULL)) 这个给出零数量的最小价格。

         SELECT COALESCE(
                    MIN(IF(quantity_in_stock>0, price, NULL)),
                    MIN(IF(quantity_in_stock=0, price, NULL))
                ) price,
                main_product_id
           FROM mytable
          GROUP BY main_product_id

明智的做法是首先排除此子查询的故障,以确保它给出适当的结果,每个 main_product_id 一行。

然后您需要使用这个聚合结果集从您的主表中选择适当的详细记录——与最低价格相对应的记录。就像这样。

SELECT mytable.*
  FROM mytable
  JOIN (
             SELECT COALESCE(
                      MIN(IF(quantity_in_stock>0, price, NULL)),
                      MIN(IF(quantity_in_stock=0, price, NULL))
                    ) price,
                    main_product_id
               FROM mytable
              GROUP BY main_product_id
       ) m USING(main_product_id,price)

编辑 ...我在猜测您的mytable 的名称。无法从您的问题中判断出表的实际名称。你得到的错误意味着它所说的:你的一个表或子查询需要一个名为 main_product_id 的列,但没有它。我建议您在将 $query 的值传递给 MySQL 之前回显或转储该值,并从那里对其进行分析。

关于在WHERE中使用IF语句的Mysql查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28907169/

相关文章:

mysql - 错误 1062 (23000) : Duplicate entry for key 'PRIMARY'

php mysql 搜索选项组合

mysql - 我在这个查询中的错误在哪里?,我认为它是正确的,但是它标记了一个错误

mysql - 如何限制mysql用户使用mysqldump

mysql - 如何避免 optaweb-employee-rostering 在服务器重新启动时重建持久数据

mysql - 连接多个没有重复行的一对多表

php - 使用 mysql LIKE 查询获取多行。在 mysql 中有效,但在 php 中无效

mysql - LEFT JOIN 使用日期列的最新行

mysql - 如何在 WAMP 2.5 中更改 MySQL 控制台的密码

XML 数据与表数据的 MySQL 性能