簡體   English   中英

MySQL:子查詢未知列

[英]MySQL: Subquery unknown column

我的查詢遇到了問題。 我有一個包含訂單,訂單交易,訂單產品和訂單運費的數據庫。 現在我想要客戶沒有完全支付訂單的所有訂單。

我在這里創建了一個數據庫小提琴。

通過此查詢,我可以獲得特定訂單的訂單總數,在本例中為1:

SELECT SUM(total) AS orderTotal
FROM (
    SELECT order_id, SUM(price * amount) AS total
    FROM order_product
    WHERE order_id = '1'

    UNION ALL           
    SELECT order_id, price AS total
    FROM order_shipping
    WHERE order_id = '1'
) subtable
WHERE order_id <> 0 GROUP BY order_id

現在,我希望所有支付金額(order_transaction)小於訂單總額的訂單。 我嘗試了以下查詢,但它告訴我: Unknown column 'o.id' in 'where clause' 沒有行12 ,但在下面的查詢的第12行中。

SELECT SQL_CALC_FOUND_ROWS o.id
FROM `order` o
WHERE (
        SELECT IFNULL(SUM(price),0) AS transactionTotal
        FROM order_transaction 
        WHERE order_id = o.id
      ) <=
      (
        SELECT SUM(total) AS orderTotal
        FROM (
            SELECT order_id, SUM(price * amount) AS total
            FROM order_product
            WHERE order_id = o.id

            UNION ALL           
            SELECT order_id, price AS total
            FROM order_shipping
            WHERE order_id = o.id
        ) subtable
        WHERE order_id <> 0 GROUP BY order_id
      ) 
ORDER BY o.id DESC
LIMIT 0, 10;

我不明白乳清這不適用於第二個子查詢,而它在第一個子查詢中(在order_transaction表上)則可以正常工作。

預期結果:

o.id 
------
 1
 2
 4
 8
 9
10

在我的數據庫架構下面

CREATE TABLE `order` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `order_product` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL,
  `price` decimal(10,2) NOT NULL,
  `amount` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `order_shipping` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL,
  `price` decimal(10,2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `order_transaction` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL,
  `price` decimal(10,2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

FROM子句(您的UNION查詢)中的子查詢稱為派生表

關於派生表的 MySQL文檔中,您將找到:

派生表不能是相關子查詢。

這意味着您不能像這里一樣引用超出該子查詢范圍的表(別名):

WHERE order_id = o.id

但是您可以在SELECT或WHERE子句中編寫相關的子查詢。 您的查詢可以重寫為:

SELECT SQL_CALC_FOUND_ROWS o.id
    , (
        SELECT IFNULL(SUM(price),0) AS transactionTotal
        FROM order_transaction 
        WHERE order_id = o.id
    ) a
    , (
        SELECT SUM(price * amount) AS total
        FROM order_product
        WHERE order_id = o.id
    ) b
    , (
        SELECT SUM(price) AS total
        FROM order_shipping
        WHERE order_id = o.id
    ) c
FROM `order` o
ORDER BY o.id DESC
LIMIT 0, 10;

HAVING a <= COALESCE(b, 0) + COALESCE(c, 0)

演示

它雖然不會返回您的預期結果。 要解決這個問題,您可能需要將<=更改為<

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM