我正在尝试解决这个问题,但找不到正确的解决方案...我想做什么?
现在我要加入主要产品及其最便宜的变体。但我需要编辑我的查询来做到这一点: 每个变体都有 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/