2016-11-20 3 views
0

Ich habe eine Tabelle für Personen und eine Tabelle für die möglichen Gruppen, denen sie beitreten können. Mehrere Personen können natürlich in derselben Gruppe sein und eine Person kann in mehreren Gruppen sein. Ich habe Probleme herauszufinden, wie man das mit MySQL oder irgendeiner anderen SQL-Datenbank macht. Ich habe eine Lösung, aber ich weiß nicht, ob das typischerweise getan wird.Mehrere Personen in mehreren Gruppen SQL

Was ich versuchte, war eine dritte Tabelle, die ich Mitgliedschaften nannte, die aus einer Spalte für eine person_id und eine group_id bestand. Also wirklich, es ist ein Tisch für geordnete Paare.

Also habe ich Leute mit einem Namen und einem Primärschlüssel, Gruppen mit einem Namen und einem Primärschlüssel und dann Mitgliedschaften mit einem Primärschlüssel einer Person und einem Primärschlüssel einer Gruppe. Auf diese Weise kann ich den Primärschlüssel der gleichen Person mehrmals gegen verschiedene auflisten, um sie zu mehreren Gruppen zu machen.

Dann alle Mitglieder einer bestimmten Gruppe aufzulisten, würde ich diese Abfrage tun:

SELECT DISTINCT users.name AS 'Members of Group 2' 
FROM users, memberships, groups 
WHERE users.user_id = memberships.user_id 
AND memberships.group_id = 2; 

alle Gruppen aufzulisten eine Person gehört, kann ich diese Abfrage:

SELECT DISTINCT groups.name AS 'Groups of User 3' 
FROM groups, memberships, users 
WHERE groups.group_id = memberships.group_id 
AND memberships.user_id = 3; 

Ich muss den distinct-Befehl verwenden, andernfalls wird die Liste so oft wie die Gesamtzahl der Gruppen gedruckt. Wenn ich also 5 Gruppen habe und eine Liste von Personen in einer bestimmten Gruppe haben möchte, wird dieselbe Liste 5 Mal gedruckt. Ich weiß nicht, warum es das tun würde. Aber ich habe das Wort DISTINCT hineingeworfen und dann hat es geklappt.

So ist es funktional, aber es ist schlampig, und ich weiß nicht, ob das normalerweise so ist. Wie machen es die Leute normalerweise?

+0

Wir verwenden normalerweise explizite Joins anstelle der im 20. Jahrhundert verwendeten impliziten (Komma) Joins. – Strawberry

+0

@Strawberry Wie würde das im Code aussehen? – Cordello

+0

@Cordello - eine Google-Suche kann diese Frage gerne für Sie beantworten. – Parfait

Antwort

0

Nie Verwenden Sie Kommas in der FROM Klausel. Immer verwenden explizite JOIN Syntax. Ihre Abfrage sollte sein:

SELECT u.name as Group2Member 
FROM users u JOIN 
    memberships m 
    ON u.user_id = m.user_id 
WHERE m.group_id = 2; 

Hinweis: Sie brauchen nicht die groups Tabelle.

Für die Gruppen Mitglied ist in:

SELECT g.name as User3Group 
FROM memberships m join 
    groups g 
    ON g.group_id = m.group_id 
WHERE m.user_id = 3; 

Sie nicht verwenden sollten, und brauchen nicht DISTINCT für beide Abfrage. Das ist nur eine Verschwendung von Rechenressourcen.

+0

Ich mag Ihre Antwort, ich will nur sicher sein: verwendet die dritte Tabelle, die Mitgliedschaftstabelle, eine gute Praxis? – Cordello

+0

@ Cordello. . . Das ist die Tabelle, die Benutzer mit Gruppen verbindet. Sie haben keine Wahl: Das ist die Schlüsseltabelle. –