目前的MySQL的查詢
(以下是我用比較簡單方式寫的範例 跟目前的SQL是一樣的寫法 只有欄位跟表格名稱不同)
select
A.name AS `name`,
(select Bid from B JOIN C where B.cid=C.id AND A.id=B.aid AND B.id='1') AS `BID`
from A
where A.PID='A123456789' AND BID='A'
這樣會說where 找不到BID這個欄位的 錯誤
另外前同事是寫
select *
from (
select
A.name AS `name`,
(select Bid from B JOIN C where B.cid=C.id AND A.id=B.aid AND B.id='1') AS `BID`
from A
A.PID='A123456789'
) oTable
where BID='A'
這樣就可以
請問有其他效能比較好的改法嗎
select
A.name AS `name`,
B.Bid AS `BID`
from A
INNER JOIN B ON A.id=B.aid
INNER JOIN C ON B.cid=C.id
where A.PID='A123456789' AND B.Bid='A' AND B.id = '1'
這樣可以嗎?
select
A.name AS `name`,
(select Bid from B JOIN C where B.cid=C.id AND A.id=B.aid AND B.id='1') AS `BID`
from A
where A.PID='A123456789' AND BID='A'
子查詢查出來的欄位是Bid
盡管查出來後已經AS重新命名為BID
可是這時候Where條件辨識的還是舊的欄位名稱
select
A.name AS `name`,
(select Bid AS `BID` from B JOIN C where B.cid=C.id AND A.id=B.aid AND B.id='1')
from A
where A.PID='A123456789' AND BID='A'
這樣應該就可以了
效能要好:
select A.name,B.Bid "BID"
from A
inner join B on A.id = B.aid
inner join C on B.cid = C.id
where A.PID='A123456789' and B.id='1' and B.Bid = 'A'
此外你最前面的語法,因為該層你才令出BID這個東西,當然該層無法知道BID是什麼。就像是你說「我說的水果是葡萄」、「拿一串水果」,這是有先後順序的,同時發生的話,並不會知道要拿的水果是什麼水果。
野人獻曝 推一下最近在鐵人賽寫的文章:
第二堂:家事管理 - 認識查詢 (FROM→WHERE→SELECT→ORDER BY)
https://ithelp.ithome.com.tw/articles/10216972
因為SELECT 的執行順序在WHERE之後
FROM跟JOIN的執行順序在SELECT前面
所以跟樓上的大大們建議一樣
改放到FROM子查詢或JOIN,就可以在WHERE使用
另外可以參考這兩篇文章,理解SELECT子查詢跟FROM子查詢的差異:
第五堂:家事管理 - 每日家事分工一覽表 (SELECT 子查詢)
https://ithelp.ithome.com.tw/articles/10218661
第六堂:家事管理 - 最後分工日期一覽表 (FROM 子查詢 + JOIN)
https://ithelp.ithome.com.tw/articles/10219078