2011-05-27 47 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'