我正在努力解决这个问题,但我找不到合适的解决方案......我想做什么?
现在我用最便宜的版本加入主要产品。但我需要编辑我的查询来执行此操作: 每个变体都有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 ';
你有什么想法,怎么做?感谢您的帖子:)
答案 0 :(得分:1)
您应该从子查询开始,该子查询将为您提供为每个main_product_id指定的最低价格。这样就可以使用COALESCE()
从参数列表中获取第一个非NULL项。
COALESCE()
的第一个参数是MIN(IF(quantity_in_stock>0,price,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
但没有它的列。我建议你在将它传递给MySQL之前回显或转储$ query的值,然后从那里进行分析。