2012-04-08 5 views
2

Ich habe eine Datenbank mit zwei Tabellen: data und file.Zählen der Anzahl der untergeordneten Datensätze in einer Eins-zu-viele-Beziehung mit nur SQL

file_id ist ein Fremdschlüssel von data bis file. So ist die Beziehung von data zu file n zu eins.

Gibt es eine Möglichkeit, SQL nur zu verwenden, um herauszufinden, wie viele Datensätze von data auf jeden Datensatz von file verweisen?

Zum Beispiel finde ich, wie viele Datensätze von Daten beziehen sich mit ID-Datei 13:

select count(*) from data where file_id = 13; 

ich dies für jedes file_id wissen will. Ich habe versucht, den folgenden Befehl ein, dies zu achive, aber es gibt die Zählung für alle file_id Datensätze:

mysql> select distinct file_id, count(*) from data where file_id in (select id from file); 
+---------+----------+ 
| file_id | count(*) | 
+---------+----------+ 
|  9 |  3510 | 
+---------+----------+ 

Antwort

8

Distinct kehrt unterschiedliche Werte pro Zeile, nicht pro irgendeine Gruppe. MySql erlaubt die Verwendung von Aggregatfunktionen ohne eine Gruppe von, was völlig irreführend ist. In diesem Fall haben Sie eine zufällige Datei-ID und eine Anzahl aller Datensätze erhalten - sicherlich etwas, was Sie nicht vorhatten.

select file_id, count(*) 
    from data 
group by file_id 
+0

Wie würden Sie Anzeige ein 'where' Klausel, die mit dem COUNT interagierten (*)':

Um Gruppenzahl (oder eine andere Aggregatfunktion), die Verwendung group by-Klausel zu erhalten? Z.B. Wählen Sie die Anzahl, bei der die Anzahl größer als 5 ist. – DogEatDog

+1

@DogEatDog Fügen Sie die Klausel having nach der Gruppe hinzu durch: 'have count (*)> 5'. –

3

GROUP BY ...

SELECT file_id, COUNT(*) 
    FROM data 
GROUP BY file_id 
2
select file_id, count(*) 
    from data 
group by file_id