お粗末なタイトルで申し訳ありませんが、私がやろうとしていることを短く簡単に表現する方法がわかりません。
ローカライズされた既存の DB を使用して、アプリの新しい UI に取り組んでいます。言語はいくつでも作成でき、管理者はいつでも作成、編集、または削除できます。DB は他のアプリケーションによって使用されており、構造を変更できません。
DBはアートワークのコレクションを管理します。media
andなどの「アセット」のテーブルがいくつかあります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 がないもの)。さらに、任意の種類のWHERE
orORDER 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 を使用して検索/並べ替え/フィルター処理する実用的な方法はありますか?
ティア