我有一张桌子,里面有姓名,位置(住在哪里)和一个parent_id (父母存放在另一张桌子上)。例如:
name | location | parent_id
--------+-----------+-----------
Joe | Chicago | 12
Sammy | Chicago | 13
Bob | SF | 13
Jim | New York | 13
Jane | Chicago | 14
Dave | Portland | 14
Al | Chicago | 15
Monica | Boston | 15
Debbie | New York | 15
Bill | Chicago | 16
Bruce | New York | 16
我需要算一下有多少人住在芝加哥 生活在纽约的兄弟姐妹(分享一个parent_id)。所以对于上面的例子, 伯爵数为3。
name | location | parent_id
--------+-----------+-----------
Joe | Chicago | 12
Sammy | Chicago | 13 * sibling Jim lives in New York
Bob | SF | 13
Jim | New York | 13
Jane | Chicago | 14
Dave | Portland | 14
Al | Chicago | 15 * sibling Debbie lives in New York
Monica | Boston | 15
Debbie | New York | 15
Bill | Chicago | 16 * sibling Bruce lives in New York
Bruce | New York | 16
有人可以帮我写SQL来查询这个计数吗?
答案 0 :(得分:3)
看起来Minh的答案很有效,但这是使用自我加入的另一个例子。
SELECT Count(DISTINCT a.child_id)
FROM people a
JOIN people b ON a.parent_id = b.parent_id
WHERE a.location = 'Chicago' AND b.location = 'New York'
仅为列出的上表生成“3”。
编辑:根据Lithis的建议添加了DISTINCT a.parent_id。
EDIT2:正如Uueerdo所指出的那样,对于住在芝加哥的2个兄弟姐妹和住在纽约的1个兄弟姐妹来说,child_id或某种独特的身份证确实会有所帮助。我已经编辑了原始查询以反映这一点。
由于这不是你问题的真正“回答”,因为没有这样的child_id,我会推迟到Uueerdo的回答,抱歉!
答案 1 :(得分:1)
也许试试这个?
SELECT Count(*)
FROM table table1
WHERE table1.location= 'Chicago'
AND EXISTS (SELECT * FROM table table2
WHERE table1.parent_id= table2.parent_id
AND table2.location= 'New York')
答案 2 :(得分:1)
SELECT COUNT(*)
FROM `people` AS p1
WHERE p1.`location` = 'Chicago'
AND p1.parent_id IN (
SELECT DISTINCT parent_id
FROM `people` AS p2
WHERE p2.`location` = 'New York'
)
;
以Minh's为基础,这应该很快;由于子查询不再是"相关的",它不应该冒险重复执行它的可能性,一次为people
中的每一行。
答案 3 :(得分:1)
相关查询是一种非常好的方法,非常有效。避免使用不同的操作,因为这是一项昂贵的操作。 Group by是使用distinct的一个不错的选择。理解数据并相应地构造查询。这是另一个引擎优化的选项...
select count(*)
from (select * from #t where Location = 'Chicago') ch
inner join (select * from #t where Location = 'New York') ny on ch.ParentID = ny.ParentID