Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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
Mysql-检查是否有指向父级的子级_Mysql - Fatal编程技术网

Mysql-检查是否有指向父级的子级

Mysql-检查是否有指向父级的子级,mysql,Mysql,我有下表: Table_A: id parent_id 其中,parent_id指同一表上的id 当从这个表中选择时,我想知道该记录是否有任何其他记录指向它的id作为父id Record A id: 1 parent_id: NULL Record B id: 2 parent_id: 1 Record C id: 3 parent_id: 1 当选择记录A时,我想知道它是否有子记录,我不关心此时有多少子记录,只关心它是否有子记录。查询已经相当优化了,所以我最好避免事后再进行查询 到目前

我有下表:

Table_A:
id
parent_id
其中,parent_id指同一表上的id

当从这个表中选择时,我想知道该记录是否有任何其他记录指向它的id作为父id

Record A
id: 1
parent_id: NULL

Record B
id: 2
parent_id: 1

Record C
id: 3
parent_id: 1
当选择记录A时,我想知道它是否有子记录,我不关心此时有多少子记录,只关心它是否有子记录。查询已经相当优化了,所以我最好避免事后再进行查询


到目前为止,我已经尝试将该记录连接到它的子记录上,但是如果它有多个子记录,则会返回多个相同的记录。我还尝试计算它所加入的子项,但是这意味着在获取记录集合时,我只能得到1条记录

您可以使用左连接使用以下解决方案:

要获取所有不带筛选器的记录,可以使用以下解决方案:

SELECT t1.id, COUNT(t2.id) > 0 AS has_childs
FROM table_name t1 LEFT JOIN table_name t2 ON t1.id = t2.parent_id 
GROUP BY t1.id
如果您也需要应用程序中的儿童数量,您可以使用以下解决方案:

-- using a filter
SELECT t1.id, COUNT(DISTINCT t2.id) AS has_childs
FROM table_name t1 LEFT JOIN table_name t2 ON t1.id = t2.parent_id 
GROUP BY t1.id
HAVING t1.id = 1

-- without a filter
SELECT t1.id, COUNT(DISTINCT t2.id) AS has_childs
FROM table_name t1 LEFT JOIN table_name t2 ON t1.id = t2.parent_id 
GROUP BY t1.id
您可以使用EXISTS关联子查询查看表中是否有任何其他行的id值作为父\u id:

另一种可能具有更好性能的方法是,在parent_id to id上使用自左联接,并检查联接表中是否存在非空值:

SELECT DISTINCT a1.id,
       NOT ISNULL(a2.id) AS has_children
FROM Table_A a1
LEFT JOIN Table_A a2 ON a2.parent_id = a1.id
ORDER BY a1.id

啊-这很好,只是我的查询需要同时取回多条记录,所以WHERE子句将被删除,因为我在select中使用COUNT,所以我只能取回一条记录。从表_name中选择t1.id,这是一个我正在尝试做的糟糕示例。将GROUP BY添加到现有查询中为我排序了问题,非常感谢。很好的解决方案!我使用的是另一个答案,因为它只是要求我在已经得到的内容中添加一个GROUP子句,但这也可以。我正在从COUNT切换到EXISTS,因为这更具语义。@Jackhardcastle很可能一个连接也会有更高的性能。请注意,如果删除分组,则需要使用DISTINCT。请参阅我的备用查询和演示。
SELECT id,
       EXISTS(SELECT * FROM Table_A a2 WHERE a2.parent_id = a1.id) AS has_children
FROM Table_A a1
SELECT DISTINCT a1.id,
       NOT ISNULL(a2.id) AS has_children
FROM Table_A a1
LEFT JOIN Table_A a2 ON a2.parent_id = a1.id
ORDER BY a1.id