2016-04-11 14 views
0

Ich habe eine Tabelle ‚Personen‘:Datensätze auswählen Passende Zwei oder mehr Verwandte Tabellen

person_id name 

100   jack 

125   jill 

201   jane 

Und viele Untertabellen, dass der person_id könnte sein:

‚Ruder‘

id person_id 

1  100 

2  201 

'Schwimmen'

id person_id 

1  125 

2  201 

‚laufen‘

id person_id 
1  201 

‚werfen‘

id person_id 

1  125 

2  201 

ich alle Menschen in der Lage sein möchten, wählen Sie die in zwei Aktivitäten beteiligt sind, unabhängig davon, welche zwei.

+4

Ich bin ziemlich sicher, dass Sie nur eine Relationstabelle verwenden sollten, die stattdessen eine 'ActivityId' hat. Dann könnten Sie verwenden: 'SELECT p.person_id FROM Personen p INNER JOIN PersonAktivitäten pa ON p.person_id = pa.person_id GROUP BY p.person_id HAVING (COUNT (DISTINCT pa.ActivityId)> = 2)' –

+0

@TimSchmelter: die letzte Zeile sagt "Wer sind in zwei Aktivitäten beteiligt, unabhängig von denen zwei" in meiner Verteidigung ... ah gut – gbn

Antwort

1

Wie der große @TimSchmelter (großer Vorname) erwähnt, sollten Sie wirklich eine einzige PersonActivities Tabelle mit einer ID entsprechend der jeweiligen Aktivität haben.

aber sagen, dass, wenn Sie müssen Arbeit mit Ihrem aktuellen Schema, eine Option zu UNION zusammen die Aktivität Tabellen würde, und dann zählen die Personen haben zwei oder mehrere Datensätze, was bedeutet, dass sie in zwei oder mehr Aktivitäten teilgenommen .

SELECT t1.person_id, t1.name 
FROM persons 
INNER JOIN 
(
    SELECT t.person_id, COUNT(t.person_id) AS activityCount 
    FROM 
    (
     SELECT person_id FROM rowing 
     UNION ALL 
     SELECT person_id FROM swimming 
     UNION ALL 
     SELECT person_id FROM running 
     UNION ALL 
     SELECT person_id FROM throwing 
    ) AS t 
    GROUP BY t.person_id 
    HAVING COUNT(t.person_id) > 1 
) t2 
    ON t1.person_id = t2.person_id 
+0

Nur um darauf hinzuweisen, das geht nicht zu 100% Arbeit, weil die Aktivität Tabellen einen Ersatzschlüssel haben und ich denke nicht, OP Erzwingt eine eindeutige Einschränkung für die person_id in jeder dieser Tabellen. So kann Rudern die gleiche Person zweimal haben, aber +1 für die Antwort und Ihre Bearbeitung, um ein besseres Schema zu verwenden. – gh9

+0

Sie könnten eine "virtuelle" 'ActivityName'- oder' ActivityId'-Spalte hinzufügen, die Sie für die 'GROUP BY' verwenden können. Zum Beispiel: '... SELECT Person_ID, Aktivität = 'Rudern' FROM Rudern UNION ALL SELECT Person_ID, Activity = 'Schwimmen' vom Schwimmen ...' –

Verwandte Themen