Verknüpfen Sie 2 untergeordnete Tabellen mit übergeordneten Tabellen, ohne sie zu duplizieren

8

Problem

Ich habe 3 Tabellen: Menschen, Telefone und E-Mails. Jede Person hat eine eindeutige ID und jede Person kann mehrere Nummern oder mehrere E-Mails haben.

Vereinfacht sieht das so aus:

%Vor%

Ich versuche, sie ohne Duplikate zusammenzufügen. Es funktioniert großartig, wenn ich versuche, nur E-Mails mit Leuten oder nur Telefone mit Leuten zu verbinden.

%Vor%

Wenn ich versuche, E-Mails und Telefone bei Personen zu verbinden, bekomme ich Folgendes:

%Vor%

Was passiert ist - wenn eine Person 2 Nummern hat, werden alle ihre E-Mails zweimal angezeigt (Sie können nicht sortiert werden, was bedeutet, dass sie nicht von @last entfernt werden können)

Was ich will:

Unterm Strich, wenn ich mit @last spiele, möchte ich mit so etwas enden, aber @last wird nicht funktionieren, wenn ich ORDER-Spalten nicht richtig ordne - und das scheint ein großes Problem zu sein. .Orden Sie in der E-Mail-Spalte. Wie aus dem obigen Beispiel ersichtlich:

Steven hat 2 Telefonnummern und 3 E-Mails. Die JOIN E-Mails mit Zahlen passiert mit jeder E-Mail - also doppelte Werte, die nicht sortiert werden können (SORT BY funktioniert nicht auf ihnen).

%Vor%

Nun wurde mir gesagt, dass es am besten ist, E-Mails und Nummern in getrennten Tabellen zu speichern, weil man viele E-Mails haben kann. Wenn es also so üblich ist, was ist nicht eine einfache Lösung?

Ich wäre auch glücklich mit einer PHP-Lösung.

Was ich jetzt zu tun weiß, befriedigt es, ist aber nicht so hübsch.

Wenn ich es mit GROUP_CONTACT mache, bekomme ich ein befriedigendes Ergebnis, aber es sieht nicht so schön aus: Ich kann keinen "Email type = work" daneben setzen.

%Vor%     
cvetozaver 23.11.2012, 16:18
quelle

3 Antworten

1

Was Sie wollen, ist eigentlich gar nicht das, was Sie wollen, wenn das irgendeinen Sinn ergibt ... Sie können mit Ihrer Datenbankausgabe nicht wirklich etwas Programmatisch machen, Sie müssen etwas damit machen (es sei denn, Sie sind einfach eine Abfrage direkt in Ihrer Datenbank ausführen).

Und da Sie gesagt haben: "Ich wäre auch mit einer PHP-Lösung zufrieden." ... was Sie wirklich wollen, ist etwas wie ein PHP "Benutzer" -Objekt, etwas wie (das ist natürlich alles hypothetisch):

%Vor%

Ihr Datenbankabstraktionsobjekt muss dann nur einige sehr einfache Abfragen durchführen, um Ihre Benutzer-, Benutzer-E-Mail- und Telefonnummerntabellen zu lesen und die Ergebnisse als Arrays zurückzugeben, die Sie dann direkt in Ihr PHP-Objekt einfügen können. Zum Beispiel:

%Vor%

Dies zerlegt Ihr Problem in kleinere, einfacher zu handhabende Probleme und verpackt sie alle in nette PHP-Objekte, mit denen Sie dann tatsächlich arbeiten können.

Ihr Benutzerobjekt wird eine Liste haben, wenn Telefonnummern und E-Mails mit etwas wie $oUser->getEmails(); leicht abgerufen werden können, und wenn sie als assoziatives Array innerhalb des Objekts gespeichert sind, können Sie sie sogar mit "label"% co_de abrufen %

    
CD001 23.11.2012 17:02
quelle
1

Wenn ich es richtig verstanden habe, müssen Sie auch andere Felder mit E-Mails verknüpfen (zB: type).

Mit group_concat können Sie den Ergebnissen den E-Mail-Typ hinzufügen, in meinem Beispiel ";" Trennen Sie mail von type und "," die Ergebnisse.

%Vor%     
Ivan Buttinoni 23.11.2012 20:41
quelle
0

Fist erstellen temporäre Tabelle Name temp_tb als Datensatz einfügen. Dann machen Sie die Partition mit Row_Number () und löschen Sie alle Datensätze dieser Liste mehrmals. Wie gegeben Schlag.

%Vor%

Ich hoffe, es hilft Ihnen.

    
Mutlib Khan 20.06.2014 12:30
quelle

Tags und Links