MySQL:使用 ORDER BY 和 UNION

标签 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 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表中选择所有特价,并根据价格将它们关联到不同的价格过滤器
  • 每种产品可以有多个特价,因此只需选择优先级较高且持续时间较长的一个即可
  • 从产品表中选择所有常规价格(仅选择在product_special 表中没有特价的产品),并根据价格将它们关联到不同的价格过滤器

我收到的错误:

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

示例数据集:

Products

Specials

感谢任何帮助。

最佳答案

当您使用UNION时查询 LIMITORDER BY对于每个单独的查询,您需要使用括号来组织查询,例如

(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)
)

关于MySQL:使用 ORDER BY 和 UNION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23088818/

相关文章:

python - Django 迁移 : django. db.utils.OperationalError : (1824, "Failed to open the referenced table ' classroom_user'")

mysql - 创建MYSQL触发器以根据另一列的计算更新列

php - 尝试将 for i+ 放入 mysql 查询、php wordpress 中

e-commerce - 电子商务::购物车::我应该将购物车数据存储在 session 中还是数据库中

ruby-on-rails - ROR的电子商务 gem ?

php - OpenCart DB查询问题(语法误解)

php - 在 mySQL 中将日期值转换为会计/纳税年度

php - 在 PHP MySql 站点中实现信用卡处理

MySQL - 如何更改列中的值?

paypal - Opencart Paypal 标准不处理