MySQL:使用ORDERBY和UNION

MySQL:使用ORDERBY和UNION,mysql,e-commerce,opencart,mysql-workbench,Mysql,E Commerce,Opencart,Mysql Workbench,请查看以下查询: INSERT INTO product_filter (product_id,filter_id) SELECT product_id, (CASE WHEN price < 100 then 1 WHEN price >= 100 AND price < 500 then 2 WHEN price >= 500 AND price < 1000 then 3 WHEN price >= 1000 AND price < 1500 th

请查看以下查询:

INSERT INTO product_filter (product_id,filter_id)
SELECT product_id,
(CASE WHEN price < 100 then 1
WHEN price >= 100 AND price < 500 then 2
WHEN price >= 500 AND price < 1000 then 3
WHEN price >= 1000 AND price < 1500 then 4
WHEN price >= 1500 AND price < 2000 then 5
WHEN price >= 2000 AND price < 2500 then 50
WHEN price >= 2500 AND price < 3000 then 6
ELSE 51 END) AS filter_id
FROM product_special
ORDER BY priority DESC, date_end DESC
LIMIT 1
UNION
SELECT product_id,
(CASE WHEN price < 100 then 1
WHEN price >= 100 AND price < 500 then 2
WHEN price >= 500 AND price < 1000 then 3
WHEN price >= 1000 AND price < 1500 then 4
WHEN price >= 1500 AND price < 2000 then 5
WHEN price >= 2000 AND price < 2500 then 50
WHEN price >= 2500 AND price < 3000 then 6
ELSE 51 END) AS filter_id
FROM product WHERE product_id not IN
(SELECT product_id FROM product_special)
这就是查询应该做的:

从product_special表中选择所有特殊价格,并根据价格将其关联到不同的价格过滤器 每种产品都可以有多种特殊价格,所以只需选择优先级更高、持续时间更长的产品即可 从产品表中选择所有常规价格,仅选择那些在产品\u特殊表中没有特殊价格的价格,并根据价格将其关联到不同的价格过滤器 我收到的错误信息:

错误代码:1221。UNION和ORDER BY的用法不正确

样本数据集:

感谢您的帮助

当您对每个单独的查询使用带有LIMIT或ORDER BY的UNION查询时,您需要使用括号组织查询,如

(query 1 with limit order by ) 
 UNION 
(query 1 with limit order by )
可以将上述查询编写为以避免此错误

INSERT INTO product_filter (product_id,filter_id)
(
SELECT product_id,
(CASE WHEN price < 100 then 1
WHEN price >= 100 AND price < 500 then 2
WHEN price >= 500 AND price < 1000 then 3
WHEN price >= 1000 AND price < 1500 then 4
WHEN price >= 1500 AND price < 2000 then 5
WHEN price >= 2000 AND price < 2500 then 50
WHEN price >= 2500 AND price < 3000 then 6
ELSE 51 END) AS filter_id
FROM product_special
ORDER BY priority DESC, date_end DESC
LIMIT 1 )
UNION
(SELECT product_id,
(CASE WHEN price < 100 then 1
WHEN price >= 100 AND price < 500 then 2
WHEN price >= 500 AND price < 1000 then 3
WHEN price >= 1000 AND price < 1500 then 4
WHEN price >= 1500 AND price < 2000 then 5
WHEN price >= 2000 AND price < 2500 then 50
WHEN price >= 2500 AND price < 3000 then 6
ELSE 51 END) AS filter_id
FROM product WHERE product_id not IN
(SELECT product_id FROM product_special)
)

您需要在第一个查询中使用ORDER BY和LIMIT的子查询

大概是这样的:

INSERT INTO product_filter (product_id,filter_id)
SELECT * FROM
(SELECT product_id,
(CASE WHEN price < 100 then 1
WHEN price >= 100 AND price < 500 then 2
WHEN price >= 500 AND price < 1000 then 3
WHEN price >= 1000 AND price < 1500 then 4
WHEN price >= 1500 AND price < 2000 then 5
WHEN price >= 2000 AND price < 2500 then 50
WHEN price >= 2500 AND price < 3000 then 6
ELSE 51 END) AS filter_id
FROM product_special
ORDER BY priority DESC, date_end DESC
LIMIT 1) a
UNION
SELECT product_id,
(CASE WHEN price < 100 then 1
WHEN price >= 100 AND price < 500 then 2
WHEN price >= 500 AND price < 1000 then 3
WHEN price >= 1000 AND price < 1500 then 4
WHEN price >= 1500 AND price < 2000 then 5
WHEN price >= 2000 AND price < 2500 then 50
WHEN price >= 2500 AND price < 3000 then 6
ELSE 51 END) AS filter_id
FROM product WHERE product_id not IN
(SELECT product_id FROM product_special)

您应该将括号括起来,以便对单个查询使用顺序/限制

比如说

(SELECT * FROM table1 WHERE ... ORDER BY field1 LIMIT 0, 1)
UNION   
(SELECT * FROM table1 WHERE ...)

如果使用括号外的Order,则它适用于联合结果

谢谢,错误现在消失了。我只是不知道为什么查询没有做它应该做的事情@farjam您能提供两个表的样本数据集而不是整个数据集吗?插入后,只需一个样本和所需的结果集看起来像product_filter,很容易看到结果on@M哈立德·朱奈德,我把它们附在问题上了,谢谢。它们是CSV文件。谢谢,错误现在消失了。我只是不知道为什么查询没有做它应该做的事情。