2016-04-19 6 views
1

Ich mag Beiträge von Benutzern auswählen, die bestimmte Anhänger haben, die höher als der Gesamtdurchschnitt ist (im Vergleich zu anderen Benutzern)MySQL: wo Zahl ist höher als der Durchschnitt

Das Problem ist, wenn ich AVG() verwende es begrenzt die Anzahl der Beiträge/Benutzer kommen durch, aber ich kann GROUP BY j.id nicht verwenden, da es die durchschnittliche Zählung und WHERE j2.fCount >= j2.oAvg Anschläge brechen richtig

Hier ist mein Code

SELECT * FROM ( 

    SELECT j.*, ROUND(AVG(j.fCount)) as oAvg 
    FROM ( 

    SELECT p.id , COUNT(fCount.id) as fCount 
FROM `post` p 

LEFT JOIN `table` table ON ... 
LEFT JOIN `user` user ON .... 
LEFT JOIN `follow` fCount ON fCount.user_id=user.id AND fCount.follow_id=table.ids 
WHERE p.user_id=fCount.user_id 
group by p.id 


) j 
---- > `GROUP BY j.id` - BREAKS THE AVERAGE BELOW 
) j2 


WHERE j2.fCount >= j2.oAvg 

Sie arbeiten Danke :)

Antwort

0

Da Sie versuchen, mit Durchschnitt zu vergleichen, müssen Sie Ihre innere Abfrage möglicherweise zweimal so tun.

SELECT *, 
    (SELECT AVG(fCount) as average FROM 
     (SELECT COUNT(fCount.id) as fCount 
     FROM post p 
     LEFT JOIN follow fCount ON fCount.user_id = p.user_id 
     GROUP BY p.id 
     )j1 
    )as average 
FROM 
    (SELECT p2.id, COUNT(fCount2.id) as fCount 
    FROM post p2 
    LEFT JOIN follow fCount2 ON fCount2.user_id = p2.user_id 
    GROUP BY p2.id 
)j2 
HAVING fCount >= average 

sqlfiddle ersetzen nur innere Abfragen von j1 ​​und j2 mit j

wenn Sie nur innere Abfrage ausgeführt werden soll, sobald Sie benutzerdefinierte Variablen verwenden können Ihre Zählung teilen sie durch Zählung auf insgesamt bis zu berechnen Sie Ihre eigenen Durchschnitt ähnliche

SELECT id,fCount,@sum/@count as average 
FROM 
(SELECT id, 
     fCount, 
     @sum := @sum + fCount as total, 
     @count := @count + 1 as posts 
FROM 
     (SELECT p.id,COUNT(fCount.id) as fCount 
     FROM post p 
     LEFT JOIN follow fCount ON fCount.user_id = p.user_id 
     GROUP BY p.id 
     )j, 
     (SELECT @sum:=0.0,@count:=0.0)initialize 
)T 
HAVING fCount >= average 

sqlfiddle

+0

Danke, aber ist es eine effizientere Art und Weise, dies zu tun? anstatt es zweimal zu zählen – user6227254

+0

Ich glaube nicht, dass es einen Weg gibt ... aber ich könnte falsch sein –

+0

Ich denke, wenn Sie wirklich wollten, könnten Sie eine Speicherprozedur erstellen, die Ihre j-Tabelle als temporäre Tabelle erstellt. dann Abfrage auf dieser j-Tabelle und dann, wenn der Speicherproc fertig ist, können Sie es fallen lassen. Ich weiß nicht, wie sonst Sie es tun können, ohne diese innere Tabelle zweimal zu fragen –