2011-08-15 5 views
2

私はさまざまなデータ型のカスタムフィールドをサポートするホスト型オンラインストア製品を持っています。追撃に切断、誰でものように定義されたテーブルに追加することにより、任意のレコードに余分なキー/値のペアを追加することができます。ヨーロッパではMySQLのロケールフォールバックにサブクエリを使用する

`storeId` varchar(20) NOT NULL, 
`locale` varchar(100) NOT NULL, 
`table` varchar(30) NOT NULL, 
`id` varchar(50) NOT NULL, 
`key` varchar(30) NOT NULL, 
`value` mediumblob NOT NULL, 
PRIMARY KEY (`storeId`, `locale`, `table`, `id`, `key`) 

、多くの人々は、複数の言語をサポートしたいので、各キーが持つことができます異なるロケールの複数の値。各ストアには、デフォルトのロケール(ストア所有者によって指定される)とアクティブロケール(顧客によって選択される)があります。

ので、同様に、私は一緒に入れしようとしているクエリが動作します。アクティブなロケールとデフォルトのロケールがそうであるように

  • storeIdtableidは、すべての知られています。
  • アクティブなロケールでキーの値を使用できない場合は、代わりにデフォルトのロケールの値が返されます。
  • デフォルトのロケールの値も使用できない場合は、の値を他のロケールのに戻します。

私は、望みの結果を達成するかなり厄介なクエリを考え出しました。店舗IDが1、テーブルがProducts、IDがgadget1であるとします。デフォルトロケールはen_AUで、アクティブロケールはde_DEです。クエリを実行するには、次のようにします。

SELECT * FROM 
    (SELECT `key`, `value` 
    FROM nf_CustomFields 
    WHERE `storeId` = 1 
     AND `table` = 'Products' 
     AND `id` = 'gadget1' 
    ORDER BY `locale`='de_DE' DESC, 
     `locale`='en_AU' DESC 
    ) 
AS a 
GROUP BY `key`; 

これはうまくいきますが、醜いですが、効率が悪いようです。私は良い方法があることを知っているが、私はそれに私の指を置くことはできません。

誰かが何か良いことを示唆できますか?

多くの感謝!

+0

私はこれまで同様のことをしてきました。私はちょっと別にそれを設定した:各ものは、元の/デフォルトの言語をし、その後、一連の翻訳していた。そうすれば、3つ目の選択肢はありません。彼らの言語か、アイテムの母国語が得られます。 OTOH、 'en_AU'は英国で一定の魅力を持っています:) –

+0

OKこれは、私がやっていたことは、とにかく最善のことだったことが判明しました。しかたがない。男は夢を見ることができます。 –

答えて

1

LEFT JOINING​​を自分自身に割り当ててから、ネイティブ言語の行がない場合はLEFT JOINが生成するNULLを無視するためにCOALESCEを使用できます。この(未テストとおそらく動作していない)、クエリのような何か:

select coalesce(nl.`key`, def.`key`), 
     coalesce(nl.`value`, def.`value`) 
from nf_CustomFields nl 
left outer join nfCustomFields def 
    on nl.`store` = def.`store` 
    and nl.`table` = def.`table` 
    and nl.`id`  = def.`id` 
    and nl.`locale` = 'de_DE' 
where def.`locale` = 'en_AU' 
    and def.`id`  = KNOWN 
    and def.`store` = KNOWN 
    and def.`table` = KNOWN 

KNOWNは、もちろん、あなたの既知の値に置き換えられるだろうと、あなたは'de_DE'そしてもちろん'en_AU'の代わりに、実際の動的な値を使用すると思います。

+0

面白い考え。私はそれに渦を立てますが、私はそれが計画C(使用可能なロケールに戻ってくる)を許可するかどうかはわかりません。乾杯! –

+0

@Neil: "利用可能な言語"のものを許すようにそのアプローチを拡張することができると確信しています。 LEFT JOINをもう一度実行し、結合条件とWHEREを再確認し、COALESCE呼び出しに別の列を追加します。それはかなりではありませんが、適切なインデックスでうまくいくはずです。 –

+0

ありがとうございます。私はいくつかのベンチマークを行い、あなたに戻ってくるでしょう:) –

関連する問題