簡體   English   中英

如何對另一個表鏈接的兩個表執行MySQL選擇查詢

[英]How to do a MySQL select query on two tables linked by another table

假設我有一個表,其功能是專門根據OOP鏈接其他兩個表。

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

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中所有人的電話號碼開頭,比方說,(234)。

我將如何在此表結構中鏈接選擇查詢...我將運行什么查詢?

首先,做這個表的唯一原因是你有多對多的關系。 雖然一個人可以有很多電話號碼,但真的一個電話號碼有多少人? 如果這是真的,那么你的架構實現了這個要求,但這對我來說似乎有點過度設計:-)

其次,這是一個相當簡單的連接。 您要做的是首先選擇有問題的電話號碼,然后給出,從第三個表中選擇人員ID,然后給出,從第一個表中選擇名稱。 就像是:

SELECT t1.name作為名稱,t2.number來自table1 t1,table2 t2,table3 t3其中t2.number喜歡'234%'和t3.personid = t1.id和t3.phoneid = t2.id;

如果需要外連接語義(包括帶有NULL的某些字段),您還可以將“blah.id = blah.id”重寫為連接。

我假設了人名和電話號碼的列名,並假設您想要返回一個列表,其中包含任何電話號碼開頭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,所以我可能會添加一些特定於平台的功能,如果您有任何問題,請告訴我。

或者你可以使用內連接而不是“in”,但這種方式感覺它更接近地描述了所需的效果。 此外,它避免了必須做任何“區分”,以避免讓有2個電話號碼開始234的人出現兩次。

對於一個人的數字:

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

選擇person.id,person.name來自
table1 as person,
table2作為數字,
table3作為鏈接
其中person.id = link.person-id
和numbers.id = link.phone-number-id
和numbers.phonenumber喜歡'234%'

它將類似於以下內容。 使用標准SQL,這里我們使用person表的內連接來獲取名稱,然后使用另一個連接到結果子查詢(通過電話模式過濾)以獲得匹配數字的人。

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

首先...... Table 3不需要列ID

只需將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%'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM