2017-11-30 2 views
0

Ich brauche Ihre Hilfe für eine bestimmte SELECT auf 3 Tabellen. Ich bin nicht qualifiziert auf SQL, so ist es eine schwierige SELECT für mich, da ich COUNT (nehme ich an) auf die Abfrage anwenden müssen.Wählen Sie mit Anzahl auf 3 Tabellen

zeige ich Ihnen meine Tabellen: enter image description here

ich wissen muss, wie viele Kontakte dort in der Datenbank vorhanden sind (alle Kontakte !!!!) und wie viele Fotos und Videos sind gebunden zu jedem Kontakt.

ich ein ähnliches Ergebnis wie dieses erhalten sollte:

----------------------------------- 
| ID | NAME  | PHOTO | VIDEO | 
----------------------------------- 
| 1 | MARK  | 3  | 1  | 
----------------------------------- 
| ID | LISA  | 2  | 0  | 
----------------------------------- 

Danke für Ihre Hilfe

+0

Was haben Sie versucht? Zeigen Sie uns Ihren aktuellen Anfrageversuch. – jarlh

Antwort

1

Sie können den folgenden Ansatz verwenden, wenn Sie in der Abfrage zögerlich Duplikate sind, können Sie eine SQL verwenden Funktion und übergeben Sie den Typparameter als Zeichenfolge. Wenn Sie eine unbestimmte Anzahl von Typen (VIDEO, PHOTO, TEXT usw.) haben, müssen Sie das Ausgabetabellenformat neu entwerfen (ich würde mit dem folgenden Tupel TYPE, CONTACT_ID, COUNT gehen), oder im schlimmsten Fall mit dynamischer Abfragekonstruktion gehen.

select c.ID, c.NAME, 
(select count(*) from CONTACT_MEDIA cm join MEDIA m on 
m.ID = cm.ID_MEDIA and m.TYPE = 'PHOTO' where cm.ID_CONTACT = c.ID) as PHOTO, 
(select count(*) from CONTACT_MEDIA cm join MEDIA m on 
m.ID = cm.ID_MEDIA and m.TYPE = 'VIDEO' where cm.ID_CONTACT = c.ID) as VIDEO 
from CONTACT c 
+0

Danke Mann, das scheint zu sein, was ich brauchte :) – MDP

+0

Np. Ich werde meine Antwort nicht noch einmal bearbeiten. Aber ich möchte den dynamischen Ansatz kommentieren. In diesem Fall müssen Sie alle eindeutigen Typen finden und dann über sie iterieren, indem Sie der Abfrage eine neue Ausgabe-Spalten-Definition in Form von Zeichenfolge hinzufügen. Danach können Sie eine konstruierte Abfrage mit 'sp_executesql' ausführen. Es wird funktionieren, aber es ist nicht effizient und schwer aus der Client-Perspektive zu konsumieren. Aber wenn Sie keine Optionen haben, dann ist es ein Weg zu gehen. – Irdis

1

Bitte unten Abfrage verwenden, dies wird Ihnen genaue

führen
select contact_media.ID_Contact, contact.Name, count(M1.ID) as 'PHOTO', COUNT(M2.ID) as 'VIDEO' from Contact inner join contact_media on Contact.ID=contact_media.ID_Contact 
left outer join media M1 on contact_media.ID_Media=M1.ID and M1.TYPE='PHOTO' 
left outer join media M2 on contact_media.ID_Media=M2.ID and M2.TYPE='VIDEO' 
group by contact_media.ID_Contact, contact.Name 
+0

Vielen Dank für Ihre Hilfe Mann. Ich habe Ihre Anfrage versucht, aber es gibt ein Problem. Wenn ein Kontakt kein Foto/Video hat, wird er nicht aus der Datenbank "genommen". Ich brauche alle Kontakte in der Datenbank. Ich sollte ich Ihre Abfrage bearbeiten, um alle Kontakte zu erhalten? – MDP