powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос с выборкой из множеств значений
8 сообщений из 8, страница 1 из 1
Запрос с выборкой из множеств значений
    #39412975
ldar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблицы
1. filter_table
items_id | value
1 | 10
1 | 5
2 | 6
2 | 8

2. user_data_table
items_id | value | user_id
1 | 10 | 1
2 | 6 | 1
1 | 5 | 2
2 | 8 | 2
1 | 7 | 3
2 | 4 | 3

Нужно получить user_data_table.user_id у которых
user_data_table.items_id = 1 AND user_data_table.value in [10,5]
AND
user_data_table.items_id = 2 AND user_data_table.value in [6,8]
Чтоб в итоге получилось
user_id |
1 |
2 |

Таблица filter_table динамичная, т.е там могжет быть любое количество полей с разными items_id

Как составить такой запрос?
...
Рейтинг: 0 / 0
Запрос с выборкой из множеств значений
    #39412979
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ldarТаблица filter_table динамичная, т.е там могжет быть любое количество полей с разными items_idВот это - как понимать?

ldarНужно получить user_data_table.user_id у которых
user_data_table.items_id = 1 AND user_data_table.value in [10,5]
AND
user_data_table.items_id = 2 AND user_data_table.value in [6,8]
Отбор по указанным условиям, а потом группировка по user_id и проверка, что COUNT(items_id, user_id) равно 2.
Надеюсь, на комбинацию (items_id, user_id) наложено требование уникальности?
...
Рейтинг: 0 / 0
Запрос с выборкой из множеств значений
    #39413004
ldar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaldarТаблица filter_table динамичная, т.е там могжет быть любое количество полей с разными items_idВот это - как понимать?
Сорри, не полей, а зписей
AkinaldarНужно получить user_data_table.user_id у которых
user_data_table.items_id = 1 AND user_data_table.value in [10,5]
AND
user_data_table.items_id = 2 AND user_data_table.value in [6,8]
Отбор по указанным условиям, а потом группировка по user_id и проверка, что COUNT(items_id, user_id) равно 2.
Надеюсь, на комбинацию (items_id, user_id) наложено требование уникальности?
Да, комбинация уникальна.
А можно пример, если возможно?
Я просто не понимаю, каким образом это все сделать одним запросом
...
Рейтинг: 0 / 0
Запрос с выборкой из множеств значений
    #39413019
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaОтбор по указанным условиям
WHERE
Akinaгруппировка по user_id
GROUP BY
Akinaпроверка, что
HAVING
...
Рейтинг: 0 / 0
Запрос с выборкой из множеств значений
    #39413046
ldar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, Это я понял.
Вот такое чудо получилось
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
  SELECT
    SUM(IF(udi.items_id  AND udi.user_id, 1, 0)) xxx,
    udi.*
  FROM user_data_table udi
    INNER JOIN filter_table ft
      ON ft.items_id  = udi.items_id  AND   udi.value = ft.value
  GROUP BY udi.user_id 
  HAVING xxx=2


Только тяжелый получился, можно ли как нибудь оптимизировать?
...
Рейтинг: 0 / 0
Запрос с выборкой из множеств значений
    #39413075
ldar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просто в моем запросе получается, что по INNIER JOIN вытягиваются много лишних данных, которые равны или одному items_id или другому а их около 7000 из за этого тормоза, а по HAVING только фильтруются те что нужны их около 500.
Есть ли другой метод обработки, без HAVING?
...
Рейтинг: 0 / 0
Запрос с выборкой из множеств значений
    #39413095
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ldarможно ли как нибудь оптимизировать?
udi.items_id используется в условии связывания, так что по логике он не должен быть ни 0, ни NULL, следовательно, ему в условии функции IF() делать нечего. То же и по udi.user_id, который присутствует в выражении группировки. Т.е. получается, что условие в IF() всегда истинно, и значение всегда 1, а потому SUM() вообще можно заменить на COUNT(). А раз само значение этого выражение тебе не нужно, ибо используется исключительно в HAVING - то его следует убрать из выходного набора и записывать непосредственно в HAVING. Т.е. получится
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT udi.user_id
FROM user_data_table udi
INNER JOIN filter_table ft
     ON udi.items_id = ft.items_id
    AND udi.value    = ft.value
GROUP BY udi.user_id 
HAVING COUNT(udi.user_id)=2


А разогнать запрос можно наличием подходящих индексов.
...
Рейтинг: 0 / 0
Запрос с выборкой из множеств значений
    #39413105
ldar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Спасибо.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос с выборкой из множеств значений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]