| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MySQL > Помогите сделать выборку из каталога с отдельной т |
| Автор: Reverent 1.2.2016, 02:38 | ||
| Помогите сделать выборку из каталога с отдельной таблицей свойств. Добрый день, уважаемые форумчани. Уже несколько дней ломаю голову, как можно реализовать следующую задачу, которая стоит в проекте. Представьте, что у нас есть каталог наподобие такого: id_catalog name А так же у нас есть таблица, которая хранит свойства каждого товара и его значение. id_catalogParam id_catalog label value Как видим мы имеем связь один ко многим. Например у нас есть товар пылесос, а у него может быть очень много параметров. Все вроед выглядет идеально, но проблема наступает на этапе выборки, когда мне нужно создать фильтр. Например я хочу найти все пылесосы, с определенной мощностью и ценой, я пишу.
Но таким образом он находит товары либо с мощностью 300, либо с ценой 7000. А мне нужно полное соответствие, тогда я заменяю OR на AND. Но поиск ничего не дает. И это вполне понятно, нет такой записи где бы value равнялось и тому и другому. Так как решить эту проблему, как провести эту выборку, чтобы она дала товары полного соотевствия. |
| Автор: ksnk 1.2.2016, 08:17 | ||
Есть такая функция - EXISTS
Тонкость в том, что запрос не сможет выдать все свойства товара за раз, только ID товара. Придется потом отдельным запросом их выковыривать. |
| Автор: igorold 1.2.2016, 09:19 | ||
Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Pomogite-sdelat-vyborku-iz-kataloga-s-otdelnoy-t-id56ae9b18ae20156f088b4567#findElement_E7045_56aef902ae20156b57f1e3df_0 |
| Автор: Akina 1.2.2016, 11:33 | ||||||
| Классический подход - это обработка таблицы параметров в подзапросе с получением только тех объектов, для которых найден необходимый комплекс характеристик. Т.е. подзапрос выглядит приблизительно так:
Все указанные фильтры включаются в секцию WHERE через OR, причём тут допустимы любые типы условий, например:
Количество соответствующих фильтров указывается в секции HAVING, причём там может задаваться и количество, не равное количеству отдельных фильтров - например, если всего указано 5 фильтров, то секция может быть такой:
Полученный подзапрос даёт все id_catalog, которые соответствуют набору фильтров и требуемому количеству соответствий, и это значение используется для отбора записей основной таблицы. |
| Автор: ksnk 1.2.2016, 11:49 |
| Akina, "Классика" - это бОльшее соответствие стандарту SQL? В смысле EXISTS - это такая mysql фича, которая другими системами может и не поддерживаться. А вот в mysql реальности есть ли заметные преимущества "классики" перед ESISTS подходом? Интерес шкурный |
| Автор: tzirechnoy 1.2.2016, 21:05 |
| EXISTS есть как миниму в SQL92. |
| Автор: Zloxa 2.2.2016, 10:25 | ||||||||||||
Хотел было поспорить, но походу это платформспецифик маси, покуда он не умеет выполнять exists, траснформируя его в http://dev.mysql.com/doc/refman/5.7/en/subquery-optimization.html#semi-joins. Увы,
Далее, сорри - А так вобще экзистс вполне себе может выполняться и джойном. При высокой селективности и при индексированной паре (тип, значение), отбираем по индексу самый селективный предикат, потом нестедлупим второй.
План
Здесь он сначала по индексу находит property по p.type = 2 and p.value = 2, затем по индексу подтягивает его entity, затем по индексу смотрит для него property по type = 1 и фильтрует по value = 1 Хавингом получается трохан подольше
При низкой селективности, казалось бы, должно быть наоборот. Ведь джойн потребует двух фулсканов там где having потребует одного. Но практика это не подтверждает
|
| Автор: Angel_666 2.2.2016, 12:57 |
| Не знаю как вариант. 1. выбрать id товара по одному свойству допустим цене (получили 30 id) 2. следующий запрос по другому свойству мощности но с ограничением id уже полученных товаров. 3. ну и так далее... Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Pomogite-sdelat-vyborku-iz-kataloga-s-otdelnoy-t-id56ae9b18ae20156f088b4567#findElement_E7045_56b07d72ae2015976af19e1e_0 |
| Автор: Akina 2.2.2016, 15:46 |
Гм... это вариант, навеянный привычкой вытащить все данные на клиента и там их обрабатывать, вместо того, чтобы поручить это SQL-серверу. |