2012-08-03 53 views
3

我正在使用muli語言網站,我有他們可能使用或可能不使用該網站所有語言的文章。此外,用戶還有可能註冊並選擇首選語言。SQL,按文章語言排序,優先級爲英語,然後是法語

我的問題是,當顯示一篇文章時,我希望它以這種方式顯示:如果用戶登錄,然後顯示他選擇的語言,如果文章不是他的語言嘗試和在英語中其他顯示它,如果不存在法語,然後德國等

這是我的文章表:

news_id | lang | title | text | 
     1 | en | News en | bla.. | 
     1 | fr | News fr | bla.. | 
     2 | en | New en | bla.. | 
     3 | fr | Nws fr | bla.. | 

我不知道如何做到這一點在MySQL。

我希望你能理解我的問題,我真的不知道如何更清楚地解釋它。

回答

1

雖然戈登的答案在技術上是正確的,但我會向你推薦一個稍微不同的方法:你可以添加另一個表(我們稱之爲language),它定義了一個使用的語言集上的。

 language 
-------------------------- 
| id | name | rank | 
-------------------------- 
    1  en  1 
    2  fr  2 
    3  de  3 
    4  nl  4 

此表的數據集現在決定您的網站語言的部分順序。要使用它,在你查詢你會做線沿線的東西:

SELECT a.* 
    FROM article a 
     , language b 
    WHERE a.id = [xxx] 
    AND a.lang = b.name 
ORDER BY (a.lang = [session.lang]) DESC, 
     b.rank ASC 
    LIMIT 1 

有什麼意義,你問?
好吧,通過這種方式設置,一旦您需要將部分語言的部分順序更改爲不同的語言,您就不必更新查詢以反映該更改。誠然,這只是一個簡單的問題,但不會太麻煩,但是一旦你建立了幾十個語言意識的查詢,它就會讓你陷入困境。

3

您需要加入到用戶偏好表中,以獲得所需的語言。然後按以下順序使用該信息:

select a.* 
from articles a cross join 
    (select up.* 
     from UserPreferences up 
     where up.userid = <whatever you want> 
    ) up 
order by (case when a.lang = up.prefland then 0 
       when a.lang = 'en' then 1 
       when a.lang = 'fr' then 2 
       else 3 end) asc 

此特定順序首先執行首選語言,然後是英語,然後是法語。要首先獲得首選,請刪除後兩個「when」子句。

+0

非常感謝,但我不會使用連接,因爲語言變量實際上存儲在會話變量中。 – 2012-08-03 14:52:02