2010-07-24 57 views
4

假設我有一個表,其功能是專門在OOP方面來鏈接其他兩個表連接的兩個表一個MySQL選擇查詢。如何做另一個表

假設我有兩個表:一個人的名字,另一個用於電話號碼:

Table 1: 
id person's name 
1 John 
2 Smith 

Table 2: 
id Phone number 
5  23424224 
6  23424242 

然後,我有一個第三個錶鏈接的人和他們各自的電話號碼:

Table 3: 
id person-id phone-number-id 
1   1   5 
2   2   6 

因此約翰的電話號碼23424224和史密斯有電話號碼23424242.

我想運行一個SQL查詢來從表1,其電話NUM所有人ber先說,(234)。

我怎麼會去這個表結構...我會運行哪些查詢中聯的選擇查詢?

+1

你要找的關鍵字是'JOIN'。 – pascal 2010-07-24 07:45:35

+0

請親切地使兩個電話號碼看起來不同,以避免我們混淆 – nawfal 2012-01-12 20:46:50

回答

3

第一,唯一的理由這樣做表,如果你有很多一對多的關係。 雖然一個人可以有很多電話號碼,真的可以有一個電話號碼有很多人嗎? 如果這是真的,那麼你的模式實現了這一要求,但這似乎有點過度設計給我:-)

其次,這是一個相當簡單的連接。你想要做的是先選出有問題的電話號碼,然後從第三個表格中選出人員ID,然後從第一個表格中選擇名稱。例如:

SELECT t1.name as name,t2.number from table1 t1,table2 t2,table3 t3其中t2.number像'234%'和t3.personid = t1.id和t3.phoneid = t2。 ID;

您也可以重寫「blah.id = blah.id」作爲加盟,如果你需要外連接語義(包括與NULL的某些字段)。

+0

+1爲幽默:) – nawfal 2012-01-12 20:49:42

+1

@ Jon-Watte「真的可以有一個電話號碼有很多人嗎」?是:在室友或家人中共享固定電話。 – Medorator 2013-08-04 12:06:03

0

我假設了人名和電話號碼的列名,並且假定您想返回一個人名單,其中的任何電話號碼開頭234(而不是所有的電話號碼必須開始234)。

SELECT 
    persons-name 
FROM 
    Table1 
WHERE 
    id IN 
     (SELECT 
      Table3.person-id 
     FROM 
      Table3 
      INNER JOIN Table2 ON Table2.id = Table3.phone-number-id 
     WHERE 
      phone-number like '234%') 

我不得不承認只知道MS-SQL,因此我可能會添加一些特定於平臺的功能,請告訴我是否有任何問題。

另外,您可以使用內部聯接,而不是一個「中」,但這樣一來感覺它更緊密地描述了預期的效果。此外,它避免了必須做任何「區別」,以避免有兩個電話號碼的人開始出現兩次。

0

對於數字的人:

SELECT persons.name, numbers.phone_number FROM persons 
    LEFT JOIN person_number ON person_number.person-id = persons.id 
    LEFT JOIN numbers ON person_number.phone-number-id = numbers.id 

對於多項

SELECT persons.name, numbers.phone_number FROM numbers 
    LEFT JOIN person_number ON person_number.phone-number-id = numbers.id 
    LEFT JOIN persons ON person_number.person-id = persons.id 
0

選擇person.id,從
如表1人person.name,
表2的人數字,
表3作爲鏈接
其中每son.id =鏈接。人-ID
和numbers.id = link.phone數-ID
和numbers.phonenumber像 '234%'

0

這將是像下面這樣。使用標準SQL,在這裏我們使用一個到人表的內部聯接來獲取名字,然後是到結果子查詢的另一個聯接(通過你的電話模式進行過濾)來獲得匹配數字的人。

SELECT T1.fullname, T.phone_number 
FROM TABLE3 AS T3 
INNER JOIN TABLE1 AS T1 
     ON T3.person_id = T1.id 
INNER JOIN (
     SELECT phone_id, phone_number 
     FROM TABLE2 
     WHERE phone_number LIKE '%PATTERN%' 
) AS T 
    ON T3.phone_id = T.id 
0

首先...你不需要在Table 3ID

只要使personId和phoneId您的主鍵

這就是您的多對多表(將多個電話與同一個人相關聯)的目的。您可以爲不同的手機ID設置相同的人員ID,反之亦然,也就是說,您可以爲不同的人員ID設置相同的手機ID。你永遠不會有兩行具有相同的人物ID和手機ID。這根本沒有意義。

有了這個查詢,你會得到預期的結果:

SELECT p.* 
FROM Person as p, Phone as ph, PersonPhone as pf 
WHERE pf.PersonId = p.Id AND pf.PhoneId = ph.Id and ph.Number like '234%'