Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SQL按精确的连接行数查找行?_Sql_Join - Fatal编程技术网

如何使用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的父表中查找特定的行,这些行在名为Ab的子表中有两个精确的相关行。 在示例表中,只有一行是合适的(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。这回答了您在这里提出的问题。如果你有一个不同的问题,作为一个新问题提问,并接受这个问题的答案。