SQL,按文章语言排序,优先使用英语,然后是法语

时间:2012-08-03 14:33:30

标签: php mysql sql

我正在使用muli语言网站,我有他们可能会或可能不会使用该网站所有语言的文章。此外,用户还可以注册并选择首选语言。

我的问题如下,当显示我希望它以这种方式显示它的文章时:如果用户登录然后显示他选择的语言,如果文章不是他的语言尝试和显示如果它不存在法语,那么它在英语中,然后是德语等。

这是我的文章表:

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中执行此操作。

我希望你能理解我的问题,我真的不知道如何更清楚地解释它。

2 个答案:

答案 0 :(得分: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”子句。

答案 1 :(得分:1)

虽然Gordon的回答在技术上是正确的,但我建议你采用一种稍微不同的方法:你可以添加另一个表(让我们称之为language),在所使用的语言集上定义partial order。 / p>

        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

你问的是什么意思?
好吧,设置这种方式,一旦您需要将语言集上的部分顺序更改为不同的语言,您就不必更新查询以反映该更改。当然,只需要几个查询就不会有太多的麻烦,但是一旦你建立了几十种语言感知的查询,它就会让你陷入困境。