0

製品を含むテーブルと、これらの製品の名前を含む別のテーブルがあります (製品には、異なる言語で複数の名前を付けることができます)。

現在、次のようなクエリを使用して、すべての製品の名前を一覧表示しています。

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は私が望むことを行うことができません:-(

4

2 に答える 2

1

製品の英語名だけを取得しようとしていますか?これはあなたの質問が示唆しています:

SELECT name
FROM name_table LEFT JOIN
     product_table ON name_table.product = product_table.product
where language = 'en'
ORDER BY name_table.product

または、外国の名前を取得しようとしていますが、英語の名前で製品を注文していますか?その場合は、追加の参加が必要です。

SELECT name
FROM name_table LEFT JOIN
     product_table 
     ON name_table.product = product_table.product and
        name_table.language <> 'en' left outer join
     product_table pten
     on name_table.product = product_table.product and
        name_table.language = 'en'
ORDER BY pten.name, name_table.product_id

これは、製品の英語名が1つしかないことを前提としています。ソートの2番目の句は、英語の名前がない場合に、他のすべての名前をまとめるためのものです。

于 2012-07-20T18:11:32.727 に答える
0

クエリを定義した方法では、製品テーブルに参加する必要はまったくないようです。

name_table に product 列、language 列、および取得しようとしている名前がある場合、product_table への結合があるのはなぜですか? 明確にしてください。あなたが何をする必要があるのか​​ はわかっていると思いますが、質問は私にとって紛らわしい方法で表現されています.

于 2012-07-20T18:16:19.537 に答える