2016-03-31 4 views
0

mit dem folgenden Schema http://sqlfiddle.com/#!9/dbc328 Ich habe zwei Tabellen:MySQL - zählen Elemente in einem anderen Tabelleneinträge mit (INNER JOIN)

Namen

id 
name 

und

Adressen

id 
nameId 
address 

Ich muss herausfinden, wie viele Ressourcen in names eine bestimmte Anzahl von Adressen haben, zum Beispiel 3 Adressen.

Verwenden Sie die folgende Abfrage:

SELECT n.id 
FROM `names` n 
INNER JOIN `addresses` a on a.nameId = n.id 
group by n.id 
having count(a.id) = 3 

ich herausfinden kann, welche diese Namen sind, aber ich brauche eine count().

Wenn Zählung zu verwenden versuchen, wie

SELECT count(n.id) as cnt 
FROM `names` n 
INNER JOIN `addresses` a on a.nameId = n.id 
group by n.id 
having count(a.id) = 3 

funktioniert nicht, weil ich group by bin mit. Ich weiß, dass ich das erreichen konnte, indem ich verschachtelte Abfragen verwendete, aber ich möchte wissen, ob es unter Verwendung einer einzelnen Abfrage durchgeführt werden kann.

EDIT: Die erwartete Antwort sollte eine einzelne Zeile sein, die ein einzelnes Feld 'cnt' enthält, die die Anzahl der Namen mit jeweils 3 Adressen zurückgeben sollte.

z.B. die Antwort 2 in diesem Fall sein sollte, da die einzigen Einträge, die unsere Kriterien entsprechen sind 1 und 4

EDIT: Hier ist die verschachtelte Abfrage, die auf

select count(n.id) as cnt 
from `names` n 
where n.id IN (SELECT n.id 
FROM `names` n 
INNER JOIN `addresses` a on a.nameId = n.id 
group by n.id 
having count(a.id) = 3) 

ich erreichen möchte die gleiche Sache funktioniert OHNE mit verwenden Sie eine verschachtelte Abfrage

Danke, Daniel

+1

, was Ihre erwartete Ausgabe als pe r Ihre gegebene Tabelle? – Sadikhasan

+0

Die erwartete Antwort sollte eine einzelne Zeile sein, die ein einzelnes Feld 'cnt' enthält, das die Anzahl der Einträge in der Tabelle 'names' mit jeweils 3 Adressen zurückgeben sollte. – Daniel

+0

Sie müssen Ihre Abfrage als Unterabfrage verwenden und in der äußeren Abfrage "count" anwenden. –

Antwort

0
SELECT COUNT(*) AS total 
FROM 
    (SELECT a.nameId 
    FROM `names` n 
    INNER JOIN `addresses` a ON a.nameId = n.id 
    GROUP BY n.id 
    HAVING count(a.id) = 3) AS TEMP 
+0

Ich benötige eine Abfrage, die eine einzelne Zeile mit einem einzigen "cnt" -Feld zurückgibt, das die Gesamtanzahl der Einträge in der Namentabelle enthält, mit jeweils 3 Adressen z. die Antwort sollte in diesem Fall "2" sein, da die einzigen Einträge, die unseren Kriterien entsprechen, sind "1" und "4" – Daniel

+0

@Daniel CHeck meine bearbeitete Antwort mit Demo – Sadikhasan

+0

Warum müssen Sie innen zählen? – sagi