【问题标题】:MySQL: Using ORDER BY and UNIONMySQL:使用 ORDER BY 和 UNION
【发布时间】:2014-05-30 02:36:20
【问题描述】:

请看下面的查询:

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 表中没有特价的价格)并根据价格将它们关联到不同的价格过滤器

我收到的错误:

Error Code: 1221. Incorrect usage of UNION and ORDER BY

样本数据集:

Products

Specials

感谢任何帮助。

【问题讨论】:

    标签: mysql e-commerce opencart mysql-workbench


    【解决方案1】:

    当您将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)
    )
    

    【讨论】:

    • 谢谢,错误现在消失了。我只是不知道为什么查询没有做它应该做的事情。 Website
    • @farjam 你能否提供两个表的样本数据集而不是整个数据集只是一个样本,并且所需的结果集在插入后看起来像 product_filter 那样很容易看到发生了什么跨度>
    • @M Khalid Junaid,我将它们附加到问题中,谢谢。它们是 CSV 文件。
    【解决方案2】:

    您需要在第一个查询中为ORDER BYLIMIT 使用子查询。

    类似这样的:

    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)
    

    【讨论】:

    • 谢谢,错误现在消失了。我只是不知道为什么查询没有做它应该做的事情。 Example on my Website
    【解决方案3】:

    您应该使用圆括号来对单个查询使用 ORDER/LIMIT

    例如

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

    如果你在括号外使用 Order BY,它适用于 UNIONED 结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 2011-04-01
      • 2017-11-02
      • 2010-10-04
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多