MySQL查询返回值是该组一部分的所有组

时间:2019-06-04 15:38:39

标签: mysql sql

假设我有一个表contract_items。我的contract_items表具有字段item_idcontract_id

我需要构建一个查询,该查询从表中获取与给定项目相同的contract_id的所有项目,并将它们的item_id一起返回到group_concat中。该查询将具有类似where in子句的内容,但相反,因为我需要基于单个ID的整个组。

类似:

...
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
)

如何使查询更好(假设itemnum是给定的项目)?

1 个答案:

答案 0 :(得分:2)

使用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)上使用索引。