假设我有一个表contract_items
。我的contract_items
表具有字段item_id
和contract_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
是给定的项目)?
答案 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)
上使用索引。