2

我有两张桌子: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,但我无法找到任何内置机制来完成这项工作。)

4

1 回答 1

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)
于 2013-01-29T05:26:53.480 回答