[英]Better way for SQL LEFT JOIN OR condition
我已經進行了一些搜索但沒有成功,我想知道是否有一些更好的方法來重寫sql查詢,因為LEFT JOIN
中的OR
條件會降低性能:(
例如:
SELECT DISTINCT * FROM computers
LEFT JOIN monitors ON computers.brand = monitors.brand
LEFT JOIN keyboards ON computers.type = keyboards.type
LEFT JOIN accessories ON accessories.id = keyboards.id OR accessories.id = monitors.id
GROUP BY computers.id
ORDER BY computers.id DESC
抱歉,您的問題很愚蠢,但是可以重寫OR
語句來提高性能嗎?
我懷疑這會有所不同,但是您可以嘗試執行以下操作:
SELECT DISTINCT *
FROM computers
LEFT JOIN monitors ON computers.brand = monitors.brand
LEFT JOIN keyboards ON computers.type = keyboards.type
LEFT JOIN accessories ON a1.id IN (keyboards.id, monitors.id)
GROUP BY computers.id
ORDER BY computers.id DESC
如果您願意使用兩組配件列(也可以在SELECT
列表中使用一束coalesce()
,則也可以兩次連接到同一張表:
SELECT DISTINCT * FROM computers
LEFT JOIN monitors ON computers.brand = monitors.brand
LEFT JOIN keyboards ON computers.type = keyboards.type
LEFT JOIN accessories a1 ON a1.id = keyboards.id
LEFT JOIN accessories a2 ON a2.id = monitors.id
GROUP BY computers.id
ORDER BY computers.id DESC
而且,首先,此查詢在大多數現代數據庫引擎中都不合法。 如果要對字段GROUP BY
,則ANSI SQL標准說您也不能只將*
(即使使用DISTINCT
)放在SELECT
列表中,因為您沒有指定在數據庫滾動時要保留的值和要丟棄的值組...結果是不確定的,這是一件壞事。
您正在執行SELECT DISTINCT *
,因此它將檢查您的整個記錄在它得到的所有行中都是唯一的,這是3個表的價值。 如果正確設置了您的主鍵和唯一索引,則它可能已經是唯一的了,因此它絕對是唯一的,因此只需將其取出即可。
如果您的主鍵和索引沒有設置,請首先執行此操作。 名為id的字段上的主鍵。
那和SELECT *
會產生很大的開銷,因為它必須弄清楚其余的列是什么。
在不知道表結構實際是什么的情況下進行猜測:由於要按GROUP BY computers.id
進行分組,因此請將其放入SELECT
並將其從GROUP BY
取出。
SELECT DISTINCT computers.id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.