2011-05-27 44 views
2

我已经陷入了在表之间查找公共项的特定问题。我必须与这3张桌子一起工作 - 人们可以拥有多个房屋。SQL构建搜索查询以匹配多个ID

我想找到那些拥有相同的家庭为“李四”所有的人

Persons 
    +------+------------------+----------+ 
    | id | firsname   | lastname | 
    +------+------------------+----------+ 
    | 1 | John    | Doe  | 
    +------+------------------+----------+ 

Home 
+------+------------------+-----------+ 
| h_id |  address  | year_built| 
+------+------------------+-----------+ 
| 1 | 1233 SQL PL NW | 1995  | 
+------+------------------+-----------+ 

Ownership 
+-----------+------------------+ 
| person_id |  house_id  | 
+-----------+------------------+ 
| 1  |   1  | 
+-----------+------------------+ 

我什么查询应该是我检查Persons.id匹配ownership.id当时的想法找到house.id并将它与一个Person2进行比较。

回答

4

基本上你需要去

persons -> 
    ownership -> 
     ownership that's not John Doe -> 
     back to persons again 

这应该这样做

SELECT p2.id, 
     p2.first_name, 
     p2.last_name 
FROM persons p 
    INNER JOIN ownership o 
    ON p.id = o.person_id 
    INNER JOIN ownership o2 
    ON p.id <> o2.person_id 
     AND o.house_id = o2.house_id 
    INNER JOIN persons p2 
    ON o2.person_id = p2.id 
WHERE p.id = 1 

为dtbarne注意到where子句假设你知道的ID。如果你想改变你的WHERE子句

WHERE p.first_name = 'John' and p.Last_name = 'Doe' 

的问题有,当然是如果两个记录的人共享的名称,所以你要房子的信息添加到SELECT条款来区分

你会得到多个结果
+0

假设您知道李四的ID。 – dtbarne 2011-05-27 05:10:49

+0

你不知道John Doe的名字,但是你有p2的id。 另外,非常感谢你的回复。 – Chris 2011-05-27 05:22:22

+0

+1,但DISTINCT不会伤害这个查询,我敢肯定。 – 2011-05-27 08:16:36

0

试试这个:你想找到所有拥有房子的人,房子Id在子查询列表中,这是所有由John Doe拥有的房屋。

注意:列名firsname(sic)与您的问题相符,可能是拼写错误。

select po.* 
from Persons po 
inner join ownership oo 
on po.id = oo.person_id 
where house_id in (select house_id 
    from ownership o 
    inner join persons p 
    on p.id = o.person_id 
    where p.firsname = 'John' and p.lastname = 'Doe' 
) 
+0

+1也可以工作 – 2011-05-27 05:11:47

0
SELECT Persons.* 
FROM Persons, Ownership 
WHERE Persons.id = Ownership.person_id 
    AND Ownership.house_id = 
     (SELECT Home.h_id 
     FROM Home, Persons 
     WHERE Home.h_id = Ownership.house_id 
      AND Ownership.person_id = id 
      AND Persons.firsname = 'John' 
      AND Persons.lastname = 'Doe' LIMIT 1); 
+0

使用JOIN是否被认为在风格上更正确?(诚实的问题,仍在学习) – Chris 2011-05-27 05:15:58

+0

公平的问题,可能值得一个职位本身。我发现阅读和使用我发布的语法更容易,但我明白我是少数派。 :) – dtbarne 2011-05-27 05:20:19

+0

是ANSI 92风格的连接被优先。至少你会发现什么时候你错过了一个加入,并且不会以笛卡儿的产品结束。例如Home没有加入任何东西 – 2011-05-27 05:21:21

0
SELECT p.* 
FROM persons p 
    INNER JOIN ownership o 
    ON p.id = o.person_id 
    INNER JOIN Home h 
    ON o.house_id = h.h_id 
WHERE p.firsname = 'John' and p.lastname = 'Doe'