Frage

Habe eine Tabelle Benutzer und es gibt ein Feld invited_by_id zeigt die Benutzer-id der person, die eingeladen diesen Benutzer.Brauchen Sie, um eine MySQL-Abfrage zurückgeben Zeilen alle Felder vom Benutzer plus ein invites_count Feld zeigt, wie viele Personen eingeladen wurden, durch jeden Benutzer.So etwas wie dieses:

SELECT
    User.*, Count.count
FROM
    users AS User,
    (
        SELECT COUNT(*) AS count FROM users WHERE users.invited_by_id=User.id
    ) AS Count;

Diese wird nicht arbeiten, also brauche ich einen Arbeitstag.

War es hilfreich?

Lösung

SELECT  u.*,
        (
        SELECT  COUNT(*)
        FROM    users ui
        WHERE   ui.invited_by_id = u.id
        ) AS cnt
FROM    users u    

Andere Tipps

Ok, zunächst einmal, count ist ein reserviertes Wort im sql-also können Sie es nicht verwenden, wie eine Tabelle alias (es sei denn, Sie zitieren es in gewisser Weise, aber nicht tun).Zweitens der richtige Weg, dieses problem zu lösen, ist die Einführung eines GROUP BY Klausel in der Unterabfrage.

Versuchen Sie dies:

SELECT user3.*, subquery.theCount FROM
    users AS user3
INNER JOIN ( 
    SELECT
        user1.id, count(user2.id) AS theCount
    FROM
        users AS user1
    LEFT OUTER JOIN
        users AS user2 ON user2.invited_by_id=user1.id
    GROUP BY user1.id
) AS subquery ON subquery.id=user3.id;

Hier ist ein schmutziges kleines Geheimnis über MySQL:Es ermöglicht Sie zu betrügen, mit der GROUP BY Anweisung und wählen Sie Spalten, die nicht in der GROUP BY Liste und auch nicht in der Aggregat-Funktionen.Andere RMDMSes nicht lassen Sie dies tun.

SELECT
    user1.*, count(user2.id) AS theCount
FROM
    users AS user1
LEFT OUTER JOIN
    users AS user2 ON user2.invited_by_id=user1.id
GROUP BY user1.id;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top