我正在構建一個AJAX搜索頁面,它允許客戶選擇一個數字過濾器來縮小搜索範圍。例如,用戶選擇了「iPhone 5」,並且具有額外的容量(32GB,64GB)色彩(黑色,白色..)。MySQL數據庫設計建議 - 使用連接
用戶只能選擇每個類別單選框(這樣他們就可以選擇32GB &黑色)..但他們無法選擇(32GB 64GB & &黑色作爲其中兩個屬於「能力」類)。
我已經在這裏添加了架構上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連載中的新列 - 這會不會對不好然而優化(例如,它會比目前的方法慢)
我可以看到,IN命令是簡化查詢以取代許多OR條件的好方法,因爲我想在本質上使用許多AND條件,是否有類似的IN命令用於MySQL,它將執行AND而不是OR? (希望是有道理的) 本質上,如果用戶選擇「32GB」和「黑色」,它只會返回查詢中的iPhone設備,如果它具有「32GB」和「黑色」屬性(例如,如果它不返回是iPhone 32GB白色) – Zabs
不是直接的,因爲你想用AND來檢查2個不同的行。您需要多次加入屬性,爲每個必需屬性加入一次屬性,或者加入具有require屬性值的屬性的子查詢,並計數並檢查計數是否與所需屬性值的數量相同。 – Kickstart
我明白你的意思了。這可能會變得棘手,因爲屬性的數量會有所不同(例如,某些手機不具備容量並且可能只是有顏色) 我會嘗試多次執行屬性並查看按照您在此評論正上方的評論中提到的方式工作。 – Zabs