2015-12-02 89 views
1

我有一張表,用於存儲我希望從中提取最相關數據的語言信息。如果您要求的語言可用,則應該使用該語言。如果不是,那麼它應該返回一個默認值。從MySQL中的每個分組數據中獲取單個記錄

的數據是這樣的:

ID PARENT_ID NAME LANG 
1 1   test default 
2 1   test en-GB 
3 1   test fr 
4 4   Hello default 
5 4   Hello en-GB 
6 4   Hola es 

如果我想獲得的所有西班牙語的結果,那麼我應該能夠得到記錄6和記錄1,因爲第一套不包含西班牙語版。我會怎麼做呢?

這是最接近我可以查詢得到,但我總是得到默認,從來沒有西班牙的結果:

SELECT h_id, 
    h_faq_id, 
    h_question, 
    h_language 
FROM 
    h_itsm_faqs 
WHERE 
    h_language = 'default' 
OR 
    h_language LIKE 'es' 
GROUP BY 
    h_faq_id 
ORDER BY 
    (CASE WHEN h_language LIKE 'es' THEN 1 ELSE 2 END) ASC 

我看到的選項如下:

  1. 一查詢以獲得兩個(不知道如何做到這一點)
  2. 兩個查詢來獲得語言和默認值,然後找出我需要的
  3. 獲取所有結果並通過它們排序

選項1會很棒,但值得注意的是,選項3在分頁時可能會出現問題。

+0

爲什麼比較字符串首先與'='和後來用'LIKE'比較? – Oli

+0

另外,您的GROUP BY會在ORDER BY發生之前摺疊數據,所以您總是會得到默認的 – Oli

+0

@Oli對於我來說''''或'LIKE'對我無關緊要,但我們確保了默認總是小寫字母,並且僅適用於語言有時可能會大寫的情況,因爲數據可能來自多個來源。我懷疑'GROUP BY'發生了什麼,但希望'CASE'和'ORDER BY'會首先發生。 – cchana

回答

2

一種可能的方法是使用左連接將表與自身結合在一起。然後,您可以使用默認和特定語言。

SELECT 
    f1.id, 
    f1.parent_id, 
    f1.name AS 'default_name', 
    f2.name AS 'translated_name' 
FROM 
    h_itsm_faqs f1 LEFT JOIN h_itsm_faqs f2 ON (f1.parent_id = f2.parent_id AND f2.language LIKE 'es') 
WHERE 
    f1.language = 'default' 
相關問題