[英]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.