問題:
在MySQL 資料庫中,如何有效率地選擇多列從屬性和翻譯表中,考慮到每個屬性都存在多種翻譯,並且翻譯可能不適用於所有情況下的所有語言?
答案:
建議的方法是利用子查詢在單一查詢中擷取多個欄位。關鍵在於理解子查詢可以透過將 select 語句括在括號中來充當虛擬表。
考慮以下查詢:
<code class="sql">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)</code>
在此查詢中,括號中的 SELECT 語句建立一個虛擬表 b 包含翻譯資訊所需的欄位。然後將該虛擬表連接到真實的屬性表 a,利用 ON 子句來匹配屬性並按語言進行篩選。
透過以這種方式利用子查詢,您可以有效地從單一表中選擇多個列,確保傳回所有屬性,即使是沒有指定語言翻譯的屬性。
替代方法:
或者,您可以為每列執行單獨的子查詢:
<code class="sql">SELECT a.attr, (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;</code>
但是,這種方法通常效率較低,因為它需要多個子查詢。
連接三個表(屬性、屬性語言和翻譯)可能看起來是一個可行的解決方案,但通常會產生結果與使用子查詢相比,效能較差。
以上是考慮到多種翻譯和潛在的語言差距,如何有效地從 MySQL 中的屬性和翻譯表中選擇多個欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!