Я создаю страницу поиска, подобную AJAX, которая позволяет клиенту выбирать числовые фильтры, которые сужают поиск. Например, пользователь выбрал «iPhone 5» и имеет дополнительные фильтры для емкости (32 ГБ, 64 ГБ) & цвет (черный, белый ..).Совет по разработке базы данных 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? (надеюсь, что имеет смысл) По сути, если пользователь выбирает «32 ГБ» и «Черный», он будет возвращать iPhone-устройство только в запросе, если он имеет атрибуты BOTH «32 ГБ» и «Черный» (например, не возвращается, если он это iPhone 32GB White) – Zabs
Не совсем так, как вы хотите проверить 2 разных строки с помощью AND. Вам нужно либо присоединяться к атрибутам несколько раз, один раз для каждого обязательного атрибута, либо присоединяться к подзапросам атрибутов, которые имеют требуемые значения атрибута, с подсчетом и проверкой того, что счетчик совпадает с количеством требуемых значений атрибута. – Kickstart
Я понимаю, что вы имеете в виду .. это может показаться сложным, поскольку количество атрибутов будет отличаться (например, некоторые телефоны не будут иметь емкость и могут иметь только цвет) У меня будет попытка выполнить атрибуты несколько раз и посмотреть, как это работает, как вы упомянули в комментарии прямо над этим. – Zabs