0

お粗末なタイトルで申し訳ありませんが、私がやろうとしていることを短く簡単に表現する方法がわかりません。

ローカライズされた既存の DB を使用して、アプリの新しい UI に取り組んでいます。言語はいくつでも作成でき、管理者はいつでも作成、編集、または削除できます。DB は他のアプリケーションによって使用されており、構造を変更できません。

DBはアートワークのコレクションを管理します。mediaandなどの「アセット」のテーブルがいくつかありますpieces(およびその他ですが、例としてはこれら 2 つで十分です)。

各アセット テーブルには、 というフィールドがありますlocalization。これは基本的に一意の識別子であり、同じ名前のテーブルへの FK です ( localizations)。簡単にするために、mediaテーブルが次のようになっていると仮定します

id localization
1  1
2  2
3  5
4  8
5  11
...

テーブルは同じローカリゼーションの増分を使用するため、pieces次のようになります

id localization
1  3
2  4
3  6
4  9
5  20
...

テーブルはlocalizations一連の自動インクリメント PK です。

localization
1
2
3
4
5
...

localization_entriesキーと値のペアをローカリゼーションに結び付けるテーブルがあります。

localization  language  entry_key  entry_value
1             en        title      photo of dog
1             en        detail     this is long text describing the photo of the dog.
1             es        title      foto de perro
2             en        title      photo of cat
...

特定のローカリゼーションには、使用可能な言語のいずれにも対応しない、一部またはすべての対応するエントリ キーと値がある場合があります。

ローカライズされた値を使用して検索およびソートできる必要があります。最初は、データセット全体を読み込み (複数のクエリ)、オブジェクトの PHP 配列を作成し、PHP で検索と並べ替えを実行するしか方法がないと思っていましたが、ストレート SQL を使用してそれが可能かどうか疑問に思います。

理想的には、ローカライズされたすべてのエントリ値を持つ行を取得したいと考えています。たとえば、最初のローカライズの行には、そのローカライズのすべてのローカライズされた値に加えて、メディア アイテム自体のすべてのフィールドが含まれます。

このような「作品」

SELECT media.id, media.name, en.entry_value as en_title, sp.entry_value as sp_title
FROM media
JOIN localization_entries en
ON media.localization=en.localization 
JOIN localization_entries sp
ON media.localization=sp.localization
AND en.language='en' AND en.entry_key = 'title'
AND sp.language='es' AND sp.entry_key = 'title'

しかし、明らかに、適切なキーまたは言語の entry_key を持たないものは返されません (たとえば、'title' の 'es' entry_key がないもの)。さらに、任意の種類のWHEREorORDER BY節を追加しても失敗します...

SELECT media.id, media.name, en.entry_value AS en_title, sp.entry_value AS sp_title
FROM media
JOIN localization_entries en
ON media.localization=en.localization 
JOIN localization_entries sp
ON media.localization=sp.localization
AND en.language='en' AND en.entry_key = 'title'
AND sp.language='es' AND sp.entry_key = 'title'
WHERE en.entry_value like '%whatever%' -- would not work
ORDER BY en.entry_value

このような一連の関係に対して MySQL を使用して検索/並べ替え/フィルター処理する実用的な方法はありますか?

ティア

4

1 に答える 1

2

外部結合を使用します。

SELECT media.id, media.name, en.entry_value as en_title, sp.entry_value as sp_title
FROM media
LEFT OUTER JOIN localization_entries en
ON media.localization=en.localization AND en.language='en' AND en.entry_key = 'title'
LEFT OUTER JOIN localization_entries sp
ON media.localization=sp.localization AND sp.language='es' AND sp.entry_key = 'title'

en_titleまたはsp_titleに一致する行がない場合は NULL を取得しますlocalization_entries

于 2012-08-09T23:45:17.347 に答える