2011-03-16 39 views
5

我有一个MySQL查询是如下MYSQL UNION和ORDER BY不工作

(SELECT order_product.op_id, 
     order_product.ocat_id, 
     order_product.op_partnunber, 
     order_product.op_name, 
     order_product.op_upc, 
     order_product.op_desc, 
     order_stockavailable.osa_id, 
     order_stockavailable.of_id, 
     order_stockavailable.osa_stocka, 
     order_category.ocat_name 
FROM 
    order_product 
    LEFT JOIN order_category 
    ON order_product.ocat_id = order_category.ocat_id 
    LEFT JOIN order_stockavailable 
    ON order_product.op_id = order_stockavailable.op_id) 
UNION 
(SELECT order_product.op_id, 
     order_product.ocat_id, 
     order_product.op_partnunber, 
     order_product.op_name, 
     order_product.op_upc, 
     order_product.op_desc, 
     order_stockavailable_attributes.id, 
     order_stockavailable_attributes.of_id, 
     order_stockavailable_attributes.opap_stock, 
     order_category.ocat_name 
FROM order_product 
    LEFT JOIN order_category 
    ON order_product.ocat_id = order_category.ocat_id 
    LEFT JOIN order_stockavailable 
    ON order_product.op_id = order_stockavailable.op_id 
    LEFT JOIN order_stockavailable_attributes 
    ON order_product.op_id = order_stockavailable_attributes.op_id) 
ORDER BY order_product.op_name 

查询是givng错误,T

Table 'order_product' from one of the SELECTs cannot be used in global ORDER clause

我查MySQL手册,但我没有任何线索,任何帮助都会非常棒。

回答

13
 
SELECT * 
FROM (
    SELECT order_product.op_id, 
      order_product.ocat_id, 
      order_product.op_partnunber, 
      order_product.op_name, 
      order_product.op_upc, 
      order_product.op_desc, 
      order_stockavailable.osa_id, 
      order_stockavailable.of_id, 
      order_stockavailable.osa_stocka, 
      order_category.ocat_name 
    FROM 
     order_product 
     LEFT JOIN order_category 
     ON order_product.ocat_id = order_category.ocat_id 
     LEFT JOIN order_stockavailable 
     ON order_product.op_id = order_stockavailable.op_id 
    UNION 
    SELECT order_product.op_id, 
      order_product.ocat_id, 
      order_product.op_partnunber, 
      order_product.op_name, 
      order_product.op_upc, 
      order_product.op_desc, 
      order_stockavailable_attributes.id, 
      order_stockavailable_attributes.of_id, 
      order_stockavailable_attributes.opap_stock, 
      order_category.ocat_name 
    FROM order_product 
     LEFT JOIN order_category 
     ON order_product.ocat_id = order_category.ocat_id 
     LEFT JOIN order_stockavailable 
     ON order_product.op_id = order_stockavailable.op_id 
     LEFT JOIN order_stockavailable_attributes 
     ON order_product.op_id = order_stockavailable_attributes.op_id 
) t 
ORDER BY op_name 

btw:没有必要将UNION的各个SELECT放入括号中。

+2

另外一个针对不必要的括号战斗。 – 2011-03-16 15:55:50

+0

感谢这工作完美!括号是试验和错误过程的一部分,我在发布之前尝试了各种组合。现在我需要解决t的谜团:) – Amitabh 2011-03-16 16:21:39

+0

@ pillar.of.autumn:'t'是内部查询的别名。 – 2011-03-16 16:23:11

2

尝试的

order by op_name 

代替

ORDER BY order_product.op_name 
3

尝试下面的语法?

SELECT 
    x, y 
FROM 
(
    SELECT x, y FROM z 
    UNION 
    SELECT a, b FROM c 
) 
ORDER BY 
    x, y 
+1

太棒了!只需要一个子查询别名,它是完美的 – bernie 2011-03-16 15:56:25

0
SELECT * 
FROM (SELECT order_product.op_id, 
     ... 
     FROM 
     ...) 
     UNION 
     (SELECT order_product.op_id, 
     ... 
     FROM order_product 
     ...) U 
ORDER BY op_name;