![](/img/trans.png)
[英]How to select all records from a table that do not exist in a union of two another tables in 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.