MySQL запрос возвращает все группы, где значение является частью группы - PullRequest
0 голосов
/ 04 июня 2019

Предположим, у меня есть таблица contract_items.Моя таблица contract_items содержит поля item_id и contract_id.

. Мне нужно создать запрос, который получает все элементы таблицы с таким же contract_id, как у данного элемента, возвращая их item_id s вместе в group_concat.В запросе будет что-то вроде предложения where in, но в обратном порядке, поскольку мне нужна вся группа на основе одного идентификатора.

Что-то вроде:

...
where item_id in item_ids

Как бы ясделай это?Единственное, о чем я могу думать, это подзапросы, но они могут плохо масштабироваться.

То, что я уже достиг:

select group_concat(i.item_id SEPARATOR ', ')
from contract_items i
where i.contract_id = (
    select contract_id
    from contract_items
    where item_id = itemnum
)

Как мне сделать этот запрос лучше (при условии * 1021)* данный предмет)?

1 Ответ

2 голосов
/ 04 июня 2019

Используйте предложение having:

select i.contract_id, group_concat(i.item_id SEPARATOR ', ')
from contract_items i
group by i.contract_id
having sum( i.item_id = @itemnum ) > 0;

Для производительности вы можете найти подзапрос лучше:

select i.contract_id, group_concat(i.item_id SEPARATOR ', ')
from contract_items i
where exists (select 1
              from contract_items i2
              where i2.contract_id = i.contract_id and
                    i2.item_id = @itemnum 
             )
group by i.contract_id;

Этот фильтр фильтрует перед агрегацией (увеличение производительности) и можетиспользуйте индекс на contract_items(contract_id, item_id).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...