![]() |
|
Модераторы: skyboy |
![]()
|
|
| maxipub |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Задача вроде примитивная, но уперся и не могу сдвинуться с мертвой точки. Бывает.
Есть группы параметров (чекбоксы):
id всех параметров уникальны, и они сгруппированы по группам Пользователь выбирает любые параметры по своему усмотрению. Нам надо выбрать из БД записи, для которых в группе указан хотя бы один параметр. Например, пользователь выбрал id 1 и 2 из группы №1 и id 5 из группы №2 (как изображено выше). Значит нам надо выбрать записи из базы, у которых есть (type_id=1 ИЛИ type_id=2) И type_id=5. В БД вся структура хранится просто списком:
Т.е. с учетом данных, выбирается только data_id = 2. Я сперва сдуру так и сделал, в лоб:
Потом сразу понял как я ступил Я уже подумал было сделать вспомогательную таблицу, которая будет хранить список всех возможных комбинаций текущих параметров групп с индексами каждой конкретной комбинации, а в types будет просто по одной строке - combination_id и data_id. Но это реальный гемор, плюс все это постоянно надо будет обновлять при любом изменении параметров или групп... |
||||||
|
|||||||
| Akina |
|
||||||||||||||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Используй следующий шаблон.
То есть применительно к твоему примеру это будет
Это - случай "хотя бы одна из". Если требуется, чтобы для группы было от M до N галочек - для неё соответственно будет условие
Не менее M (исходный случай - "хотя бы одна из", - формально эквивалентен "не менее 1", но тут особый случай, с 1 можно и не сравнивать)
Не более M
Ни одной
Добавлено @ 15:18 PS. В примере вроде бы хочется заменить
на
Не советую - единообразие шаблона дороже, чем дополнительная обработка "особых" случаев. А серверу так и вовсе пофиг. Это сообщение отредактировал(а) Akina - 18.11.2014, 15:20 -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||||||||||||||
|
|||||||||||||||||
| maxipub |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Блин, HAVING SUM это что-то гениальное, первый раз такое вижу!
|
|||
|
||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
полностью эквивалентен
Ибо любое ненулевое значение интерпретируется как True, нулевое как False, а NULL групповой SUM() не даёт в принципе. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| maxipub |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 517 Регистрация: 22.10.2009 Репутация: 1 Всего: 1 |
Принцип действия тут ясен. Порадовал сам подход, конструкция. Добавлено через 2 минуты и 33 секунды Да эт ясно. Там запрос составляется в php while-цикле, все подходящее скидывается в массив, implode в implode и вуаля! |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Ну просто минус одна проверка. На скорость оно, конечно, не повлияет... это как буквы экономить, вставляя тире в середину слова.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |