2

と の 2 つのテーブルがpostsありpost_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すべての投稿がスペイン語で利用できるわけではないため、必要に応じて英語にフォールバックしたいと考えています. つまり、.poststitletitleORDER BY title_with_fallbackstitle_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)

しかし、何千もの結果がある場合、それは厄介な速さになる可能性があります. 2 つのテーブルまたはそれらの線に沿ったものを結合して同じ結果を得る方法の巧妙なアイデアはありますか?

(参考までに、私は Rails プラグインglobalize3を使用していますが、この作業を行うための組み込みメカニズムを見つけることができませんでした。)

4

1 に答える 1

1

このクエリは、2 つの条件付き順序付けを実行しますleft joins... 1 つはスペイン語の翻訳に、もう 1 つは英語の翻訳に...

ORDER BYIFNULL関数を使用してスペイン語のタイトルで並べ替えます。スペイン語のタイトルが の場合は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 に答える