從MySQL 中的子查詢中選擇多個欄位
您有一個場景,您需要擷取每個屬性的id 和值(翻譯)以指定語言。但是,某些屬性可能沒有給定語言的翻譯。
子查詢的效能注意事項
一種方法是對每列使用子查詢,如範例所示:
select attribute, (select id from attributeTranslation where attribute=a.id and language=1), (select translation from attributeTranslation where attribute=a.id and language=1), from attribute a;
雖然這種方法有效,但如果MySQL 無法最佳化子查詢,則會引發效能問題。
使用虛擬表
更有效的解決方案是利用虛擬表。透過將子查詢括在括號中,我們可以建立一個虛擬表,該表可以連接到查詢中的其他表。
SELECT a.attr, b.id, b.trans, b.lang FROM attribute a JOIN ( SELECT at.id AS id, at.translation AS trans, at.language AS lang, a.attribute FROM attributeTranslation at ) b ON (a.id = b.attribute AND b.lang = 1)
在此範例中,虛擬表 b 包含來自attributeTranslation 表,連接到屬性表 a。這消除了對多個子查詢的需要並提高了效能。
結論
利用虛擬表可以有效地從子查詢中選擇多個列,同時還提供了創建子查詢的靈活性複雜的連接操作。在處理效能問題時,這種方法特別有用。
以上是MySQL如何有效率地從子查詢中選擇多列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!