在查詢中,是否可以有條件地選擇要使用的連接?在下面的查詢中,m.bodyNo有時是空的,連接使用m.chassisNo而不是顯示資料,我希望它顯示任何具有值的結果。
SELECT m.`seriesYear`, m.`bodyNo`, m.`modelDesc`
FROM parts_parsed p
LEFT JOIN parts_modelno m ON p.`modelNo` = m.`bodyNo`
WHERE p.`partNo` = '$PartNos'
嘗試兩個連接會在我的查詢測驗器(HeidiSQL)中顯示所有資料,它為兩個連接的相關列提供相同的名稱,但需要為每個值提供別名并在 PHP 中執行大量條件,所以我正在尋找更直接的東西。也許像 COALESCE 這樣的東西會做,但不知道如何應用它。任何人都可以建議如何進行嗎?
SELECT m1.`seriesYear`, m1.`bodyNo`, m1.`modelDesc`, m2.`seriesYear`, m2.`bodyNo`, m2.`modelDesc`
FROM parts_parsed p
LEFT JOIN parts_modelno m1 ON p.`modelNo` = m1.`chassisNo`
LEFT JOIN parts_modelno m2 ON p.`bodyNo` = m2.`bodyNo`
WHERE p.`partNo` = '$PartNos'
如果這不會丟失其格式,則它是 parse_parts 的示例:
ID pageNo baseGroup partID partNo modelNo bodyNo isRHD
1 1 0 1 391906 2201 0
2 1 0 1 391906 2202 0
3 1 0 1 391906 2211 0
4 1 0 1 391906 2220 0
5 1 0 1 391906 2222 0
43493 315 30 9983 386405 2250 0
43494 315 30 9983 386405 2251 0
43495 315 30 9983 386405 2270 0
43496 315 30 9983 386405 2271 0
43497 315 30 9984 438463 2650 0
這是parts_modelno 的示例
ID seriesYear bodyNo chassisNo engineNo modelDesc
1 1948-49 2213 2213 G600000 HEARSE AND AMBULANCE
2 1948-49 2250 2226 G600000 7 PASS, CUSTOM EIGHT LIMOUSINE
3 1948-49 2251 2226 G600000 7 PASS, CUSTOM EIGHT SEDAN
4 1948-49 2252 2206 G600000 6 PASS, CUSTOM EIGHT SEDAN
5 1948-49 2255 2206 G600000 6 PASS, CUSTOM EIGHT CLUB SEDAN
6 1948-49 2259 2233 G600000 6 PASS, CUSTOM EIGHT CONVERTIBLE VICTORIA
7 1948-49 2262 2211 G200000 6 PASS, DELUXE EIGHT TOURING SEDAN
8 1948-49 2265 2211 G200000 6 PASS, DELUXE EIGHT CLUB SEDAN
9 1948-49 2270 2222 G400000 7 PASS, DELUXE SUPER EIGHT LIMOUSINE
10 1948-49 2271 2222 G400000 7 PASS, DELUXE SUPER EIGHT SEDAN
part_modelno 在 bodyNo 和 chassisNo 列的所有行中都具有完全填充的值,而parts_parts 具有 bodyNo 或 modelNo ,但有少數例外,但在這少數情況下,這兩個值是相同的。parts_modelno.chassisNo 匹配parts_parsed.modelNo。
uj5u.com熱心網友回復:
您可以使用這樣的案例方法..
SELECT m1.`seriesYear`,
m1.`bodyNo`,
m1.`modelDesc`,
m2.`seriesYear`,
m2.`bodyNo`,
m2.`modelDesc`
CASE
WHEN m2.value <> "" THEN m2.value
ELSE m1.value
END AS someName
FROM parts_parsed p
LEFT JOIN parts_modelno m1 ON p.`modelNo` = m1.`chassisNo`
LEFT JOIN parts_modelno m2 ON p.`modelNo` = m2.`bodyNo`
WHERE p.`partNo` = '$PartNos'
uj5u.com熱心網友回復:
在各種評論中,您表示您并不真正關心性能,在這種情況下您只想要最簡單和最可維護的代碼?
那么,只OR在連接謂詞中使用一個?
SELECT
p.`baseGroup`,
m.`seriesYear`,
m.`modelDesc`,
m.`bodyNo`,
m.`chassisNo` AS modelNo
FROM
parts_parsed p
LEFT JOIN
parts_modelno m
ON p.`bodyNo` = m.`bodyNo`
OR p.`modelNo` = m.`chassisNo`
WHERE
p.`partNo` = '$PartNos'
這假設p永遠不會同時擁有bodyNo 和 modelNo填充。如果可能的話,您需要使用您想要的行為示例來更新問題。
如其他地方所述,此代碼還意味著不能使用索引來優化查詢計劃。
編輯:
如果性能確實很重要(而且它應該,即使您只指 CPU 和磁盤利用率而不是用戶體驗),您應該只需要UNION兩個查詢。這允許優化器充分利用索引來避免無意義的讀取,選擇更好的連接實作等。
SELECT
*
FROM
(
SELECT
p.`baseGroup`,
p.`partNo`,
m.`seriesYear`,
m.`modelDesc`,
m.`bodyNo`,
m.`chassisNo` AS modelNo
FROM
parts_parsed p
INNER JOIN
parts_modelno m
ON p.`bodyNo` = m.`bodyNo`
UNION ALL
SELECT
p.`baseGroup`,
p.`partNo`,
m.`seriesYear`,
m.`modelDesc`,
m.`bodyNo`,
m.`chassisNo` AS modelNo
FROM
parts_parsed p
INNER JOIN
parts_modelno m
ON p.`modelNo` = m.`chassisNo`
)
part_list
WHERE
`partNo` = '$PartNos'
UNION ALL首選,因為UNION它避免了UNION重復資料洗掉開銷。
最終結果是只有一個或其他子查詢將包含任何給定部分的任何結果,并且每個子查詢可以使用不同的索引來優化資源利用。
- 以更長的代碼為代價
uj5u.com熱心網友回復:
可能還有其他更好的答案,但這是可行的。
SELECT COALESCE(m1.`seriesYear`, m2.`seriesYear`) AS seriesYear,
COALESCE(m1.`modelDesc`, m2.`modelDesc`) AS modelDesc,
COALESCE(m1.`bodyNo`, m2.`chassisNo`) AS bodyNo
FROM parts_parsed p
LEFT JOIN parts_modelno m1 ON p.`modelNo` = m1.`chassisNo`
LEFT JOIN parts_modelno m2 ON p.`bodyNo` = m2.`bodyNo`
WHERE p.`partNo` = '$PartNos'
uj5u.com熱心網友回復:
為什么不只coalesce用于連接?
LEFT JOIN parts_modelno m ON p.modelNo = coalesce(m.bodyNo, m.chassisNo)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/480033.html
