2016-05-23 20 views
0

Ich habe die folgenden drei Tabellen auszuwählen:fehlschlagen mit Zahl, Gruppe durch, um durch und Vereinigung in Mysql

theUser(*user_id*, user_name) 
ichat(*message_id*, sender, receiver, send_time) 
gchat(*message_id*, sender, receiver, send_time) 

Der einzige Unterschied zwischen ichat und GChat ist, dass die receiver in iChat Benutzer ist, und es ist Gruppe in gchat. Aber es wirkt sich nicht auf diese Frage aus.

Jetzt möchte ich herausfinden, die aktivsten n Benutzer (der Benutzername und die entsprechende Anzahl der Nachrichten gesendet), dh wer am häufigsten in sender erscheint. Und nach der Code Ich habe versucht:

SELECT COUNT(totalM.*) AS msge, u.name 
    FROM (
     SELECT * FROM gchat 
     UNION ALL 
     SELECT * FROM ichat) AS totalM 
    JOIN theUser u ON totalM.sender=u.user_id 
    GROUP BY totalM.sender 
    ORDER BY COUNT(*) 

bekam aber einen solchen Fehler:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '*) AS msge, u.name. 

Haben Sie eine Ahnung davon haben? Vielen Dank im Voraus!

+1

Probieren Sie 'count (*)' anstelle von 'count (totalM. *)' Count sollte das gleiche sein, oder? Da es sich um eine 1-1-Beziehung handelt, denke ich nicht, dass die Engine gerne versucht, Datensätze auf einer Seite eines Joins zu zählen. und Ihre Gruppe nach sollte mit der nicht aggregierten Spalte der Auswahl übereinstimmen. – xQbert

Antwort

1
SELECT COUNT(*) AS msge, u.name 
    FROM (
     SELECT * FROM gchat 
     UNION ALL 
     SELECT * FROM ichat) AS totalM 
    JOIN theUser u ON totalM.sender=u.user_id 
    GROUP BY u.Name 
    ORDER BY COUNT(*) 
  1. GROUP BY sollten nicht aggregierten Spalten auswählen
  2. Ich glaube, passen sich der Motor nicht eine Seite einer Join-Tabelle zählen. Es weiß nicht, dass die Beziehung 1-1 oder 1-M ist, bevor es zu zählen beginnt, also muss es beide Seiten zählen, also zählen (*).

Oder Sie könnten nur beide count (*) zu count (1) für den gleichen Effekt ich glaube wechseln.

+0

Danke, es funktioniert! Aber warum sollte es "GROUP BY u.Name" sein und nicht "totalM.sender"? – user5779223

+0

u.name ist in der Auswahl. total.sender ist nicht. Ich weiß, dass sie zum gleichen Wert net, aber Sie sollten gruppieren, was in Ihrer Auswahl ist! (nicht aggregiert) – xQbert

+0

@ user5779223 Wenn Sie mehrere Benutzer mit demselben Namen haben, wird die Gruppierung nach Name ihre Zähler zusammenführen; Du möchtest vielleicht immer noch nach user_id | sender gruppieren; Wenn dies jedoch der Fall ist, gibt es nur wenige Umstände, unter denen Sie die user_id nicht auswählen möchten. – Uueerdo