2011-02-21 12 views
5

私は次のような状況に直面しています。MySQLデータベースの複雑なソート

翻訳されたエンティティを持つCMSがあります。これらの変換は、1対多の関係で別のテーブルに格納されます。たとえば、newsarticlesおよびnewsarticle_translationsです。利用可能な金額は、同じCMSによって動的に決定されます(languages)。

新しいニュース記事を入力するときは、少なくとも1つの翻訳を入力する必要があります。使用できる言語の1つは彼までです。

私たちのCMSのニュース記事の概要では、(翻訳された)記事タイトルの列を表示したいと思いますが、いずれの言語も必須ではない(そのうちの1つは必須ですが、入力された言語にかかわらず、各ニュース記事のタイトルを選択するための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 |    | 
+-----------------+------------------+------+-----+---------+----------------+ 

PSを助けるかもしれない、私のテーブルスキーマのことです:私は、サブクエリについてかかわらきたし、()ソリューションを合体が、それらはかなり汚い手口に見える、より良い何かが私はことを知っている場合には不思議考えていない?

+1

が、それはまたのデフォルトのタイトルとして使用されるnews' 'テーブル内の' title'フィールドを持つことが理にかなって高速に動作することができますニュース記事?たとえそれがバックエンド用であったとしても? –

+0

それは私の最後の手段になるだろう冗長性の種類です。私はクリーナー/より良い解決策を探していますが、提案に感謝します。 – ChrisR

+0

LEFT JOINでしょうか? – Benubird

答えて

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; 
+0

ありがとう、それは私が必要なものではありませんが、完璧な解決策を見つけるために私の道に私を設定! – ChrisR

1

私はあなたの問題を正しく読んだと仮定して、記事のタイトルリストを取得したいと思います。そのためのクエリが利用できる場合は、この例では、(JA)第三としての第2の優先順位として、日本(JP)、およびドイツ語(DE)を英語でタイトルを好む

SELECT * FROM (
    SELECT nt.`title`, nt.news_id 
    FROM news n 
     INNER JOIN news_translations nt ON (n.id = nt.news_id) 
    WHERE title != '' 
    ORDER BY 
     CASE 
      WHEN nt.language = 'en' THEN 3 
      WHEN nt.language = 'jp' THEN 2 
      WHEN nt.language = 'de' THEN 1 
      ELSE 0 END DESC 
) AS t1 
GROUP BY `news_id` 

...の線に沿って行くかもしれません要求された言語のどれもが利用可能でない場合、最初の 'other'エントリを表示します。

+0

ほとんどの場合、順序は問題ではありません。タイトルを入力したnews_translationsテーブルから正しいレコードを選択しています。私はあなたの質問を試しましたが、タイトルのうちの1つが関連する翻訳レコードに入力されていても、空のタイトルが返されるときにはまだシナリオがあります。 – ChrisR

+2

ああ、私はそこに空白のエントリがあるとは思わなかった。潜在的にそれを解決するには、 "WHERE title!= ''/IS NOT NULL"をインナーセレクトに追加します。あなたがどうやってどうやってやっているのか教えてください。 –