【问题标题】:order by returns error in a union clauseorder by 在联合子句中返回错误
【发布时间】:2014-11-29 15:12:22
【问题描述】:

我正在使用这个查询,它在没有订购数据的情况下工作,但是在通过查询添加订单后返回错误

(SELECT * FROM bills INNER JOIN cats INNER JOIN suppliers
INNER JOIN new_cards
WHERE new_cards.`Card_Code` LIKE '%8%'
AND bills.`Sup_ID` = suppliers.`Sup_ID`
AND new_cards.`Sup_ID`  = suppliers.`Sup_ID`
AND cats.`Cat_ID` = bills.`Cat_ID`
AND bills.`Cat_ID` = cats.`Cat_ID`
AND new_cards.`Bill_ID` = bills.`Bill_ID`)
UNION
(SELECT * FROM bills INNER JOIN cats INNER JOIN suppliers
INNER JOIN sold_cards WHERE
sold_cards.`Card_Code` LIKE '%8%'
AND bills.`Sup_ID` = suppliers.`Sup_ID`
AND sold_cards.`Sup_ID`  = suppliers.`Sup_ID`
AND cats.`Cat_ID` = bills.`Cat_ID`
AND bills.`Cat_ID` = cats.`Cat_ID`
AND sold_cards.`Bill_ID` = bills.`Bill_ID`)
ORDER BY bills.`ID` DESC

这是错误 来自 SELECT 之一的表 'bills' 不能用于全局 ORDER 子句

【问题讨论】:

    标签: mysql union


    【解决方案1】:

    首先,我建议您选择列名。这样,您就知道两个查询都返回相同数量的列。然后你可以ORDER BY ID DESC

    要让你的工作正常,请识别每个联合中的 bills id 列,然后按它排序(不引用表名):

    (SELECT bills.id billsid, <<other columns>> FROM bills INNER JOIN cats INNER JOIN suppliers
    INNER JOIN new_cards
    WHERE new_cards.`Card_Code` LIKE '%8%'
    AND bills.`Sup_ID` = suppliers.`Sup_ID`
    AND new_cards.`Sup_ID`  = suppliers.`Sup_ID`
    AND cats.`Cat_ID` = bills.`Cat_ID`
    AND bills.`Cat_ID` = cats.`Cat_ID`
    AND new_cards.`Bill_ID` = bills.`Bill_ID`)
    UNION
    (SELECT bills.id billsid, <<other columns>> FROM bills INNER JOIN cats INNER JOIN suppliers
    INNER JOIN sold_cards WHERE
    sold_cards.`Card_Code` LIKE '%8%'
    AND bills.`Sup_ID` = suppliers.`Sup_ID`
    AND sold_cards.`Sup_ID`  = suppliers.`Sup_ID`
    AND cats.`Cat_ID` = bills.`Cat_ID`
    AND bills.`Cat_ID` = cats.`Cat_ID`
    AND sold_cards.`Bill_ID` = bills.`Bill_ID`)
    ORDER BY billsid DESC
    

    就个人而言,我建议您将查询重写如下:

    SELECT b.id billsid, other columns 
    FROM bills b
        INNER JOIN cats c ON c.`Cat_ID` = b.`Cat_ID`
        INNER JOIN suppliers s ON b.`Sup_ID` = s.`Sup_ID`
        INNER JOIN new_cards nc ON nc.`Sup_ID`  = s.`Sup_ID` 
                                   AND nc.`Bill_ID` = b.`Bill_ID`
    WHERE nc.`Card_Code` LIKE '%8%'
    UNION
    SELECT b.id billsid, other columns
    FROM bills b 
        INNER JOIN cats c ON c.`Cat_ID` = b.`Cat_ID`
        INNER JOIN suppliers s ON b.`Sup_ID` = s.`Sup_ID`
        INNER JOIN sold_cards sc ON sc.`Sup_ID`  = s.`Sup_ID` 
                                  AND sc.`Bill_ID` = b.`Bill_ID`
    WHERE sc.`Card_Code` LIKE '%8%'
    ORDER BY billsid DESC
    

    【讨论】:

    • 错误代码:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“* FROM bills INNER JOIN 猫 INNER JOIN 供应商 INNER JOIN new_cards WHERE n”附近使用正确的语法
    • @Yasser -- 如果您定义了另一个字段,我认为您不能在选择列表中使用 *。正如我在评论中提到的,您应该只列出列名。
    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 2018-03-23
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 2011-08-22
    相关资源
    最近更新 更多