私は顧客が検索を絞り込む数値フィルターを選択できる AJAX のような検索ページを構築しています。たとえば、ユーザーが「iPhone 5」を選択し、容量 (32GB、64GB) と色 (黒、白など) のフィルターを追加したとします。
ユーザーは、カテゴリごとに 1 つのラジオ ボックスしか選択できません (つまり、32GB と黒を選択できます)。ただし、選択できませんでした (32GB と 64GB と黒のうちの 2 つが「容量」カテゴリに属しているため)。
ここで sqlfiddle にスキーマを追加しました (sqlfiddle を最小限に抑えるために、他のフィールド/データと共に削除されたばかりの適切なアプリに存在する主キーを削除したという事実を無視してください)
http://sqlfiddle.com/#!2/964425
次のことを行うためのクエリを作成するための最良の方法を誰でも提案できますか?
Get all the prices for device_id '2939' (iPhone 5) which has the 'attributes' of '32GB' AND 'Black'
私は現在これを持っていますが、これは単一の属性を選択する場合にのみ機能します:
// search for device with '64GB' & 'Black' attributes (this currently doesn't return any rows)
SELECT `prices`.*
FROM (`prices`)
LEFT JOIN `prices_attributes` ON `prices_attributes`.`price_id` = `prices`.`id`
WHERE `prices`.`device_id` = '2939'
AND `attribute_option_id` = '19'
AND `attribute_option_id` = '47';
// search for device with '64GB' attribute only (this currently DOES return a row)
SELECT `prices`.*
FROM (`prices`)
LEFT JOIN `prices_attributes` ON `prices_attributes`.`price_id` = `prices`.`id`
WHERE `prices`.`device_id` = '2939'
AND `attribute_option_id` = '19';
データベース設計に関するアドバイスもいただければ幸いです
注: シリアル化された一致する attribute_ids を持つ「価格」テーブル内に新しい列を作成することを考えていましたが、これは最適化には適していません (たとえば、現在の方法よりも遅くなります)。