我正在使用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中执行此操作。
我希望你能理解我的问题,我真的不知道如何更清楚地解释它。
答案 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
你问的是什么意思?
好吧,设置这种方式,一旦您需要将语言集上的部分顺序更改为不同的语言,您就不必更新查询以反映该更改。当然,只需要几个查询就不会有太多的麻烦,但是一旦你建立了几十种语言感知的查询,它就会让你陷入困境。