我認為自己是一個非常精通的開發人員,但是這個讓我很難過。
實際用例比這要復雜一些(我已經構建了一個允許您過濾和搜索資料的資料視圖框架),但最簡單的......
為什么我不能做這樣的事情?:
SELECT
fundraisers.id,
(
SELECT
count(*)
FROM
transactions
WHERE
transactions.fundraiser_id = fundraisers.id) AS total
FROM
fundraisers
WHERE
total > 331
ORDER BY
total DESC
我也試過:
- 我知道我可以成功地使用
HAVING它來執行此操作,但我需要它成為 WHERE 子句的一部分,以便能夠使用正確的 AND/OR 條件將它與其他過濾器結合使用。 - 將其作為子查詢 JOIN 執行,但它似乎永遠不會為該行回傳正確的事務數。
任何幫助表示贊賞!謝謝各位。
uj5u.com熱心網友回復:
您可以使用派生表,即 FROM 子句中的子查詢,而不是選擇串列。
SELECT t.fundraiser_id, t.total
FROM
fundraisers AS f
JOIN (
SELECT fundraiser_id, COUNT(*) AS total
FROM transactions
GROUP BY fundraiser_id
) AS t ON t.fundraiser_id = f.id
WHERE
t.total > 331
ORDER BY
t.total DESC;
不能在 WHERE 子句中參考別名的原因是,在評估選擇串列中的運算式之前評估了 WHERE 子句的條件。這是一件好事,因為您不希望選擇串列針對可能會被條件過濾掉的數百萬行進行評估。僅為結果中包含的行評估選擇串列有助于提高性能。
但這意味著選擇串列中這些運算式的結果及其別名不能被 WHERE 子句中的條件參考。
我在上面的示例中顯示的解決方法在子查詢中產生結果,這發生在 WHERE 子句過濾結果之前。
uj5u.com熱心網友回復:
我不知道你想選擇什么,但試試這個
select fundraisers.id,count(*) as total FROM
fundraisers f join transactions t on t.fundraiser_id=f.fundraiser_id
WHERE
total > 331
ORDER BY
total DESC
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/516994.html
標籤:mysql
上一篇:Laravel雄辯的麻煩
