【问题标题】:MySQL "Every derived table must have its own alias"MySQL“每个派生表都必须有自己的别名”
【发布时间】:2013-09-11 09:12:50
【问题描述】:

我对这种奇怪的 MySQL 行为感到有些困惑。我收到了可怕的Every derived table must have its own alias 错误。

通常,我可以通过在主要的SELECT 语句中添加一个AS 子句来规避这个问题,但是它不适用于以下示例:

SELECT SUM (`a`.`total`) AS `total` FROM (
    SELECT COUNT(DISTINCT(`item_sales`.`id`)) AS `total`,
    (SELECT COUNT(DISTINCT(`sale_item`)) AS `offers` FROM `item_sales_bids` WHERE `user_id` = 2) AS `offers`
        FROM `item_sales`
        INNER JOIN `item_sales_bids` ON `item_sales`.`id` = `item_sales_bids`.`sale_item`
        WHERE `item_sales`.`buyer` != 2
            AND `item_sales`.`sold` = 1
        GROUP BY `item_sales`.`id`
        HAVING `offers` > 0
    ) UNION (
        SELECT COUNT(*) AS `total`,
            `item_sales`.`reserve`,
            (SELECT COUNT(*) FROM `item_sales_bids` WHERE `user_id` = 2) AS `bids`,
            (SELECT MAX(`max_bid`) AS `max` FROM `item_sales_bids` WHERE `user_id` = 2) AS `maxBid`,
            SUM((`item_sales`.`list_date` + (`item_sales`.duration * 86400)) - UNIX_TIMESTAMP()) AS `endTime`
            FROM `item_sales`
            INNER JOIN `item_sales_bids` ON `item_sales_bids`.`sale_item` = `item_sales`.`id`
            GROUP BY `item_sales`.`id`
            HAVING `endTime` < 0
                AND `maxBid` < `item_sales`.`reserve`
    )
) `a`

谁能指出我错过了什么?请注意,向联接添加别名会导致相同的错误。

【问题讨论】:

  • 如果你想得到总数,为什么你的子查询中需要有其他的内联子查询?

标签: mysql sql


【解决方案1】:

您应该在子查询中添加一个UNION 关键字,如下所示

SELECT SUM (`a`.`total`) AS `total` 
FROM (
    SELECT COUNT(DISTINCT(`item_sales`.`id`)) AS `total`,
    (SELECT COUNT(DISTINCT(`sale_item`)) AS `offers` FROM `item_sales_bids` WHERE `user_id` = 2) AS `offers`
    FROM `item_sales`
    INNER JOIN `item_sales_bids` ON `item_sales`.`id` = `item_sales_bids`.`sale_item`
    WHERE `item_sales`.`buyer` != 2
        AND `item_sales`.`sold` = 1
    GROUP BY `item_sales`.`id`
    HAVING `offers` > 0

UNION 

SELECT COUNT(*) AS `total`,
    `item_sales`.`reserve`,
    (SELECT COUNT(*) FROM `item_sales_bids` WHERE `user_id` = 2) AS `bids`,
    (SELECT MAX(`max_bid`) AS `max` FROM `item_sales_bids` WHERE `user_id` = 2) AS `maxBid`,
    SUM((`item_sales`.`list_date` + (`item_sales`.duration * 86400)) - UNIX_TIMESTAMP()) AS `endTime`
    FROM `item_sales`
    INNER JOIN `item_sales_bids` ON `item_sales_bids`.`sale_item` = `item_sales`.`id`
    GROUP BY `item_sales`.`id`
    HAVING `endTime` < 0
        AND `maxBid` < `item_sales`.`reserve`
) `a`

【讨论】:

  • 恐怕没有骰子...#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a' at line 24.
【解决方案2】:

您可以在子查询中包含UNION

SELECT SUM (`a`.`total`) AS `total`
FROM
(
    --- your first query
    UNION
    --- your second query
) a

【讨论】:

    猜你喜欢
    • 2016-10-21
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2014-04-30
    • 2012-05-16
    • 1970-01-01
    相关资源
    最近更新 更多