如何使用SQL按精确的连接行数查找行?
我有两张桌子如何使用SQL按精确的连接行数查找行?,sql,join,Sql,Join,我有两张桌子 parent: ╔════╦══════╗ ║ id ║ name ║ ╠════╬══════╣ ║ 1 ║ A ║ ║ 2 ║ B ║ ║ 3 ║ A ║ ║ 4 ║ A ║ ║ 5 ║ A ║ ╚════╩══════╝ child: ╔════╦═══════════╦══════╗ ║ id ║ parent_id ║ name ║ ╠════╬════════
parent:
╔════╦══════╗
║ id ║ name ║
╠════╬══════╣
║ 1 ║ A ║
║ 2 ║ B ║
║ 3 ║ A ║
║ 4 ║ A ║
║ 5 ║ A ║
╚════╩══════╝
child:
╔════╦═══════════╦══════╗
║ id ║ parent_id ║ name ║
╠════╬═══════════╬══════╣
║ 1 ║ 1 ║ a ║
║ 2 ║ 1 ║ b ║
║ 3 ║ 2 ║ a ║
║ 4 ║ 2 ║ b ║
║ 5 ║ 3 ║ a ║
║ 6 ║ 4 ║ a ║
║ 7 ║ 4 ║ c ║
║ 8 ║ 5 ║ a ║
║ 9 ║ 5 ║ b ║
║ 10 ║ 5 ║ c ║
╚════╩═══════════╩══════╝
我想从名为A的父表中查找特定的行,这些行在名为A和b的子表中有两个精确的相关行。
在示例表中,只有一行是合适的(id=1)
id=2的行不合适,因为父项的名称为B。id为3的行不适合,因为它只有一个子行。id=4的行不合适,因为其中一个孩子的名字为c。id=5的行不合适,因为它有一个名为c的不必要的子行
请帮助我编写SQL查询以从父表中查找具有任意数量指定子项的行。谢谢你我认为这是
加入和分组方式
,带有的
子句:
select p.id
from parent p join
child c
on p.id = c.parentid
where p.name = 'A'
group by p.id
having count(*) = 2 and
min(c.name) = 'a' and max(c.name) = 'b';
select p.id
from parent p join child c
on c.parent_id = p.id
group by p.id
having group_concat(c.name order by c.name) = 'a,b';
在HAVING
子句中,加入表,按父级id分组,并使用group_concat()
(对于MySql或其他数据库的等效函数):
select p.id
from parent p join
child c
on p.id = c.parentid
where p.name = 'A'
group by p.id
having count(*) = 2 and
min(c.name) = 'a' and max(c.name) = 'b';
select p.id
from parent p join child c
on c.parent_id = p.id
group by p.id
having group_concat(c.name order by c.name) = 'a,b';
我假设表子项中没有重复的(父项id,名称)
。如果有,则更改为:
having group_concat(distinct c.name order by c.name) = 'a,b';
您必须提供一个排序的逗号分隔列表,如'a,b'
,以指定您搜索的子项。同时指定预期的结果。如果有一行包含子项a、b和c,该怎么办?@forpas no,该行不适用。这是常见问题解答。在考虑发帖之前,请先阅读您的课本和/或手册,并在谷歌上搜索任何错误消息或您的问题/问题/目标的许多清晰、简洁和准确的措辞,包括或不包括您的特定字符串/名称和网站:stackoverflow.com&tags;阅读许多答案。如果你发布一个问题,用一句话作为标题。反思你的研究。请参阅文本上方的投票箭头鼠标(&T)。谢谢,这是一个不错的选择。但也许你可以推广你的解决方案,找到有任意数量孩子的父行?@VitalYeutukhovich。这回答了您在这里提出的问题。如果你有一个不同的问题,作为一个新问题提问,并接受这个问题的答案。