Angenommen, ich habe zwei Tabellen, people
und emails
. emails
hat eine person_id
, ein address
und ein is_primary
:Kann ich selektiv sein, auf welchen Zeilen ich mich in MySQL anmelde
people:
id
emails:
person_id
address
is_primary
Um alle E-Mail-Adressen pro Person zu bekommen, was ich tun kann eine einfache beitreten:
select * from people join emails on people.id = emails.person_id
Was passiert, wenn ich nur (höchstens) wollen eine Zeile von der rechten Tabelle für jede Zeile in der linken Tabelle? Und wenn eine bestimmte Person mehrere E-Mails hat und eine als is_primary
markiert ist, gibt es eine Möglichkeit, die zu verwendende Zeile beim Verbinden zu bevorzugen?
Also, wenn ich
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 |
------ -----------------------------------------
haben, ist es eine Möglichkeit, um dieses Ergebnis zu erhalten:
------------------------------------------------
| 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 nicht "nur ein" ist; Es ist jede Zeile von links, unabhängig davon, ob es "rechts" gibt. Wenn es auf der rechten Seite mehrere gibt, werden immer noch mehrere Kopien der Daten aus der übereinstimmenden linken Zeile sein; Wenn rechts keine vorhanden sind, haben Sie immer noch eine Kopie der Daten der linken Zeile, aber NULL für alle Felder von rechts. – Uueerdo
Wenn Person mit ID = 4 eine zweite E-Mail hat, die auch nicht primär ist - welche möchten Sie zeigen? Ein weiterer Fall: Was passiert, wenn eine Person zwei primäre E-Mails hat? Und was ist der Hauptschlüssel der 'emails' Tabelle? –
Ich würde immer is_primary = true über is_primary = false wählen, da ich ihre besten E-Mail-Adressen senden möchte. Der Primärschlüssel von E-Mails ist email.id, ich war einfach zu faul, alle Spalten einzugeben. Ich werde es hinzufügen. Wenn eine Person zwei primäre E-Mails hat, dann eine der beiden (die erste nach ID ist in Ordnung) und wenn sie mehrere nicht-primäre IDs haben, dann ist die erste auch in Ordnung. – whiterook6