Wie man eine geschachtelte Abfrage?
-
23-09-2019 - |
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.
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;