根据兄弟属性计算SQL记录

时间:2015-05-28 16:34:28

标签: mysql sql

我有一张桌子,里面有姓名,位置(住在哪里)和一个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来查询这个计数吗?

4 个答案:

答案 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