製品を含むテーブルと、これらの製品の名前を含む別のテーブルがあります (製品には、異なる言語で複数の名前を付けることができます)。
現在、次のようなクエリを使用して、すべての製品の名前を一覧表示しています。
SELECT name
FROM name_table
LEFT JOIN product_table ON name_table.product = product_table.product
ORDER BY name_table.product, language != 'en', language != '*'
これにより、すべての名前のリストが生成され、最も適切な名前 (名前があれば英語、名前が存在しない場合は国際名) が常に最初に表示されます。各製品の最初のエントリ以降のすべてのエントリをスキップするだけです。エレガントではありませんが、十分に高速に動作します。
これの問題は、アルファベット順にソートできないことです。
ただし、次のようなものを使用すると:
SELECT
product,
(SELECT name
FROM name_table
WHERE name_table.product = product_table.product
ORDER BY language != 'en'
LIMIT 1) AS bestname
FROM product_table
ORDER BY bestname
その場合、クエリは非常に遅くなります (少なくとも MySQL では)。
このクエリは高速ですが、どの名前の行が使用されているかは未定義 (したがって準ランダム) のようです。
SELECT name
FROM product_table
LEFT JOIN name_table ON name_table.product = product_table.product
ORDER BY name
結合に使用する行を MySQL に指定できれば、すべて問題ありません。
複数の一致する行が存在する場合、結合で使用される行を定義する方法はありますか?
編集: 製品には任意の言語の名前を付けることができ、すべての製品に英語の名前が付いているわけではありません。混乱して申し訳ありません.
Edit2:同等の質問を見つけました: MySQL JOIN the most recent row only? そこでは、SQLの専門家もサブセレクトを使用していました(私のサブセレクトクエリは非常に遅いので避けたいです)ので、おそらくSQLは私が望むことを行うことができません:-(