我面临以下情况.
我们有一个带有翻译实体的CMS.这些翻译存储在具有一对多关系的不同表中.例如newsarticles和newsarticle_translations.可用数量languages由同一CMS动态确定.
当输入新的新闻时,编辑需要输入至少一个翻译,他选择的一种可用语言取决于他.
在CMS的newsarticle概述中,我们希望显示一个带有(翻译)文章标题的专栏,但由于没有一种语言是强制性的(其中一种是强制性的,但我不知道哪一种)我真的不是知道如何构建我的mysql查询以选择每个新闻文章的标题,无论输入的语言如何.
为了使这一切变得有点困难,我们的经理要求也可以对标题进行排序,因此据我所知,在单独的查询中提取翻译是排除在外的.
任何人都知道如何以最有效的方式解决这个问题?
这是我的表模式,它可能会有所帮助
> desc news;
+-----------------+----------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+----------------+------+-----+-------------------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| category_id | int(1) | YES | | NULL | |
| created | timestamp | NO | | CURRENT_TIMESTAMP | |
| user_id | int(10) | YES | | NULL | |
+-----------------+----------------+------+-----+-------------------+----------------+
> desc news_translations;
+-----------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| enabled | tinyint(1) | NO | | 0 | |
| news_id | int(1) unsigned | NO | | NULL | |
| title | varchar(255) | NO | | | |
| summary | text | YES | | NULL | |
| body | text | NO | | NULL | |
| language | varchar(2) | NO | | NULL | |
+-----------------+------------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
PS:我虽然关于子查询和coalesce()解决方案,但那些似乎相当肮脏的技巧,想知道更好的东西是否知道我没想到?
这不是一个快速的方法,但我认为它可以满足您的需求。
让我知道它是如何工作的,我们接下来可以提高速度:)
select nt.title
from news n
join news_translations nt on(n.id = nt.news_id)
where nt.title is not null
and nt.language = (
select max(x.language)
from news_translations x
where x.title is not null
and x.new_id = nt.news_id)
order
by nt.title;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
417 次 |
| 最近记录: |