table 1
item group_id
123 aaaa
432 bbbb
534 aaaa
765 cccc
656 aaaa
656 cccc
111 cccc
group_id group_name
aaaa groupA
bbbb groupB
cccc groupC
我想找到所有包含765和656的组-在这种情况下,GroupC包含这两个值。
有没有一种方法可以避免一堆嵌套的查询或AND语句? 假设表1可以有成千上万的配对,而我必须找到包含30个项目的所有列表的组 编写一个非常大的查询来回答这个问题是很丑陋的。
我希望我可以说“在(765,656)中的位置”,但它的行为有所不同。如果有一堆要匹配的物品,那会很混乱。
SQL小提琴http://sqlfiddle.com/#!9/6581eb/9
示例数据(以防SQL Fiddle由于某种原因无法访问):
create table table1(itemID int,groupID varchar(4));
insert into table1(itemID,groupID)
values
(123,'aaaa')
,(432,'bbbb')
,(534,'aaaa')
,(765,'cccc')
,(656,'aaaa')
,(656,'cccc')
,(111,'cccc');
create table table2(groupID varchar(4),groupName varchar(6));
insert into table2(groupID,groupName)
values
('aaaa','groupA')
,('bbbb','groupB')
,('cccc','groupC');
答案 0 :(得分:10)
最简单的方法是使用group by
和having
:
SELECT group_name
FROM table2 g
JOIN table1 t on g.group_id = t.group_id
WHERE t.item in (765,656)
GROUP BY group_name
HAVING COUNT(DISTINCT t.item) = 2
答案 1 :(得分:0)
SELECT DISTINCT t1.group_name
FROM table1 t1 join table1 t2 join groups g
ON t1.group_id = t2.group_id
and t1.item = 765
and t2.item = 656
and g.group_id = t1.group_id
答案 2 :(得分:0)
您可以使用INTERSECT运算符。 INTERSECT返回两个表中共享的不同值。实际上,我发现它比其他方法更快。
在此示例中,我在以下查询之间插入了相交:
<tbody>
{rows.map((row,i) => {
return(
<tr key={i}>
<td scope="row" >{i}</td>
<td>{row.ex}</td>
<td>{row.ex}</td>
<td>{row.ex}</td>
<td>{row.ex}</td>
<td>{row.ex}</td>
<td>
this is the delete button
</td>
</tr>
);
})}
</tbody>
提供输出:
SELECT T2.groupName
FROM table1 T1 INNER JOIN table2 T2 ON T1.groupID = T2.groupID
WHERE T1.itemID = 765
INTERSECT
SELECT T2.groupName
FROM table1 T1 INNER JOIN table2 T2 ON T1.groupID = T2.groupID
WHERE T1.itemID = 656