ORDER BY已翻译的字段

时间:2013-01-29 05:11:49

标签: mysql

我有两个表:postspost_translations。帖子可以翻译成多种语言,其翻译存储在post_translations表中。并非所有帖子都以所有语言提供。

posts

+----+------+
| id | hits |
+----+------+
|  1 |   12 |
+----+------+
|  2 |   34 |
+-----------+

post_translations

+----+---------+--------+---------------+------+
| id | post_id | locale | title         | body |
+----+---------+--------+---------------+------+
|  1 |       1 |     en | Hello, world! | Hey. |
+----+---------+------------------------+------+
|  2 |       1 |     es | ¡Hola, mundo! | Olé. |
+----+---------+--------+---------------+------+
|  3 |       2 |     en |  How are you? | Meh. |
+----+---------+--------+---------------+------+

我想SELECT所有posts,由西班牙语title订购 - 但是,由于并非所有帖子都有西班牙语版本,我还想回到英语必要时title。也就是说,ORDER BY title_with_fallbacks其中title_with_fallbacks = [spanish title] || [english title]

我想我可以使用从属子查询:

SELECT * FROM posts ORDER BY (SELECT name FROM post_translations
                              WHERE post_id = posts.id
                              ORDER BY FIELD(locale, 'es', 'en')
                              LIMIT 1)

但如果有成千上万的结果,这可能会变得很快。关于如何通过加入两个表或某些东西得到相同结果的任何聪明的想法?

(作为参考,我正在使用Rails插件globalize3,但我无法找到任何内置机制来完成这项工作。)

1 个答案:

答案 0 :(得分:1)

此查询通过两个left joins完成条件排序...一个用于西班牙语翻译,另一个用于英语翻译...

ORDER BY然后使用IFNULL函数按西班牙语标题排序,如果西班牙语标题为NULL,则按英文标题排序。

SELECT p.id, p.hits, IFNULL(es_pt.title, en_pt.title) AS locale_title
FROM posts p
LEFT JOIN post_translations es_pt
    ON p.id = pt.post_id AND es_pt.locale = 'es'
LEFT JOIN post_translations en_pt
    ON p.ID = pt.post_id AND en_pt.locale = 'en'
ORDER BY IFNULL(es_pt.title, en_pt.title)