- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу

В 2023 году 36,9% всех DDoS-атак пришлось на сферу финансов
А 24,9% – на сегмент электронной коммерции
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Приветствую, уважаемые специалисты!
Столкнулся с одной задачкой на оптимизацию, объясню вкратце:
есть две таблицы:
`list` с полями `id`, `name`
`param` с полями `id`, `list_id`, `value`
Здесь идет связь один ко многим (`list`.`id`=`param`.`list_id`)
В таблице `param` хранятся параметры записей из таблицы `list`
Так же имеются значения нужных параметров: $param1=23, $param2='seo' и т.п.
Собственно теперь задача:
Выбрать из таблицы `list` только те записи, для которых значения параметров из таблицы `param` соответствуют заданным параметрам: $param1, $param2 и т.п.
Мое решение:
Т.е. для каждого значения параметра делаем свою выборку из одной и той же таблицы параметров.
В примере всего два параметра, а представляете что будет, если параметров, хотя бы 15 :eek:
Вот и хочется узнать мнение экспертов возможно ли оптимизировать такой запрос для большого числа параметров?
если условий WHERE немного (до 30-50) их можно формировать циклом
можно вот так:
по сути у тебя получается соединенная таблица по id-соответствию, без перечисления условий в твоем случае - никак
Что то я не пойму зачем в запросе "p1.`id`=1" и "p2.`id`=2" если по условию что вы привели то вот так делается
Но это если скажем меньше 50 параметров, если больше - через временную таблицу.
если условий WHERE немного (до 30-50) их можно формировать циклом
Формировать циклом имеется ввиду, через другой язык (например PHP) ?
Если так, то это понятно, нужно как-то сам MySQL-запрос оптимизировать, а то он громоздкий получается.
В твоем примере не определены p1 ...
да через php
Что то я не пойму зачем в запросе "p1.`id`=1" и "p2.`id`=2"
Каждый параметр имеет свой смысл, нужно чтоб значение соответствовало конкретному параметру, а не любому.
Наверно пример не совсем корректно представлен, немного подправил:
Добавил к таблице `param` поле `type`, так думаю будет более понятней.
А насчет IN я тоже думал, но в данном случае это не подходит, вот если бы можно было использовать пары, что-то типа (`type`, `value`) IN (('day', $param1), ('type', $param2)), то это и было бы оптимальное решение, не знаю можно ли так?
Значит делать надо вот так...
Потом вставляете в эту таблицу данные
И после этого вот такой запрос
Вот примерно так... возможно надо что то подправить.
SELECT list_id,COUNT(*) AS cnt FROM param WHERE value IN($param1,$param2,...)
GROUP BY list_id HAVING cnt>=PARAM_COUNT
На деле может оказаться быстрее разделить запрос на атомарные части, что-то обсчитывать кодом.
Jeck, хороший вариант, только в данном случае выберутся записи в которых присутствует хотя бы одно совпадение с параметром, аналогично:
а нужно
Dash, оператор GROUP BY `list_id` понравился, кажется нужно в этом направлении двигаться, пока только не понятно как.
А выражение value IN (...) будет пересекаться с другими типами параметров, некоторые параметры равны между собой, но соответствующие ($param1, $param2,...) не обязательно.
Т.е. если в таблице `param` есть записи (1, 'day', 23), (2, 'text', 23), и нужные параметры имеют значения $param1=23, $param2='seo', то запись выберется, хотя не соответствует желанному.
WebSee, выложите небольшие дампы таблиц что бы можно было нормально поковырять :)
Dash, оператор GROUP BY `list_id` понравился, кажется нужно в этом направлении двигаться, пока только не понятно как.
А выражение value IN (...) будет пересекаться с другими типами параметров, некоторые параметры равны между собой, но соответствующие ($param1, $param2,...) не обязательно.
Т.е. если в таблице `param` есть записи (1, 'day', 23), (2, 'text', 23), и нужные параметры имеют значения $param1=23, $param2='seo', то запись выберется, хотя не соответствует желанному.
Я приводил запрос для примера
Будут выбраны записи с одновременным удовлетворением всех условий(для этого счетчик)