2017-03-31 51 views
2

我正在嘗試執行單個MySQL查詢來選擇第三方函數內的數據,但是我遇到了問題,但他們只通過了ID。我需要使用該ID來選擇所有相關的記錄。MySQL在多個字段上進行子選擇

目前MySQL的聲明看起來是這樣的:

SELECT h.id, h.notification_id, h.status, d.detail 
FROM headers h, details d 
WHERE h.host_id = (SELECT host_id FROM headers WHERE id = '{$rowid}') 
AND h.service_id = (SELECT service_id FROM headers WHERE id = '{$rowid}') 
AND h.instance = (SELECT instance from headers where id = '{$rowid}') 
AND h.id = d.header_id; 

現在這個工作,但我想窮人的MySQL發動機運轉3子查詢,因爲我沒有3條信息提供給我。

所以我想知道是否有一種方法來運行此查詢和一個子查詢來保存數據庫上的負載?

在此先感謝。

+0

推廣使用'JOIN' sintaxis,Aaron Bertrand寫了一篇不錯的文章[踢壞壞習慣:使用舊式JOINs](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/ 08/bad-habits-to-kick-using-old-style-joins.aspx)。 –

回答

1

您可以使用元組工作(即,而不是仰視host_idservice_idinstance你查查組合(host_id, service_id, instance)):

SELECT h.id, h.notification_id, h.status, d.detail 
FROM headers h 
JOIN details d ON d.header_id = h.id 
WHERE (h.host_id, h.service_id, h.instance) = 
    (SELECT host_id, service_id, instance FROM headers WHERE id = '{$rowid}') 
; 

這使得標準它屬於哪裏:在where子句中(就像在你的查詢中一樣)。您從標題和詳細信息中選擇其中組合(host_id, service_id, instance)與具有給定ID的記錄匹配。

+0

哪個聯接或元組更快? – trevrobwhite

+0

這取決於DBMS的優化器。一個好的優化器可以爲兩個查詢執行相同的執行計劃。我努力使我的查詢儘可能可讀(這通常意味着只需從表中選擇我希望看到的數據並使用'[NOT] IN'或'[NOT] EXISTS'而不是加入)。如果我真的有性能問題,我只會改變這一點。我不認爲上述查詢會給你帶來性能問題,所以這是我的首選。最後它通常歸結爲:個人偏好。 –

+0

看起來像這樣:如果你在三,四年內看過他們,哪一個查詢會更容易理解:-) –

3

您可以使用SELF JOIN刪除多個子查詢。

試試這個:

SELECT h.id, h.notification_id, h.status, d.detail 
FROM headers h 
INNER JOIN details d ON h.id = d.header_id 
INNER JOIN headers h2 ON h.host_id = h2.host_id AND h.service_id = h2.service_id AND h.instance = h2.instance 
WHERE h2.id = '{$rowid}' 
+0

也打我吧。 'JOIN'會快得多。 – Cfreak

+0

謝謝你們倆的合作 – trevrobwhite