MySQL数据库上的复杂排序

Chr*_*isR 5 php mysql

我面临以下情况.

我们有一个带有翻译实体的CMS.这些翻译存储在具有一对多关系的不同表中.例如newsarticlesnewsarticle_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()解决方案,但那些似乎相当肮脏的技巧,想知道更好的东西是否知道我没想到?

Ron*_*nis 1

这不是一个快速的方法,但我认为它可以满足您的需求。
让我知道它是如何工作的,我们接下来可以提高速度:)

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)