假設我有兩個表,people
和emails
。 emails
有person_id
,一個address
和is_primary
:我可以選擇我在MySQL中加入的行嗎
people:
id
emails:
person_id
address
is_primary
要獲得每人的所有電子郵件地址,我可以做一個簡單的連接:
select * from people join emails on people.id = emails.person_id
,如果我只希望(最多)左表中每行的右行一行?而且,如果一個特定的人有多個電子郵件,並且其中一個被標記爲is_primary
,有沒有辦法在加入時選擇使用哪一行?
所以,如果我有
people: emails:
------ -----------------------------------------
| id | | id | person_id | address | is_primary |
------ -----------------------------------------
| 1 | | 1 | 1 | [email protected] | true |
| 2 | | 2 | 1 | [email protected] | false |
| 3 | | 3 | 2 | [email protected] | true |
| 4 | | 4 | 4 | [email protected] | false |
------ -----------------------------------------
是有辦法得到這樣的結果:
------------------------------------------------
| people.id | emails.id | address | is_primary |
------------------------------------------------
| 1 | 1 | [email protected] | true |
| 2 | 3 | [email protected] | true | // chosen over [email protected] because it's primary
| 3 | null | null | null | // no email for person 3
| 4 | 4 | [email protected] | false | // no primary email for person 4
------------------------------------------------
LEFT JOIN不爲 「只有一個」;無論是否存在任何匹配的「右側」,它都是從左側開始的每一行。如果右邊有多個,那麼匹配的左邊行仍然會有多個數據副本;如果右側沒有,則仍然有左側行數據的一個副本,但對於右側的任何字段都有NULL。 – Uueerdo
如果身份證號碼= 4的人有第二封電子郵件也不是主要的 - 您想要顯示哪一個?另一種情況:如果一個人有兩個主要電子郵件會怎麼樣?那麼'emails'表的主鍵是什麼? –
我總是選擇is_primary = true over is_primary = false,因爲我想通過電子郵件發送他們最好的電子郵件地址。電子郵件的主鍵是emails.id,我只是懶得輸入所有列。我會添加它。如果一個人有兩個主要電子郵件,那麼其中任何一個(第一個通過id都可以),如果他們有多個非主要ID,那麼第一個也是好的。 – whiterook6