SQL auf die Spalten nicht in der SELECT
Ich habe eine Tabelle mit 3 Spalten:
userid mac_address count
Die Einträge für eine Benutzer könnte wie folgt Aussehen:
57193 001122334455 42
57193 000C6ED211E6 15
57193 FFFFFFFFFFFF 2
Möchte ich eine Ansicht erstellen, die zeigt nur die MAC, die als "Häufig verwendet" für diesen Benutzer. Zum Beispiel, ich möchte zum filtern der MAC, die verwendet werden, <10% im Vergleich zu den am häufigsten verwendeten MAC-Adresse für die Benutzer. Außerdem möchte ich 1 Zeile pro Benutzer. Dies kann leicht erreicht werden mit einer GROUP BY -, HAVING & GROUP_CONCAT:
SELECT userid, GROUP_CONCAT(mac_address SEPARATOR ',') AS macs, count
FROM mactable
GROUP BY userid
HAVING count*10 >= MAX(count)
Und in der Tat, das Ergebnis ist wie folgt:
57193 001122334455,000C6ED211E6 42
Aber ich wirklich nicht wollen, dass die count-Spalte in meiner Ansicht. Aber wenn ich es aus der SELECT-Anweisung, bekomme ich die folgende Fehlermeldung:
#1054 - Unknown column 'count' in 'having clause'
Gibt es eine Möglichkeit, ich kann diesen Vorgang durchzuführen, ohne gezwungen zu haben, eine böse count-Spalte in meiner Ansicht? Ich weiß, ich kann wahrscheinlich tun Sie es mit inneren Abfragen, aber ich möchte vermeiden, dass aus performance-Gründen.
Ihre Hilfe ist sehr geschätzt!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als
HAVING
bezieht sich explizit auf die Spaltennamen in der select-Liste, es ist nicht möglich, was Sie wollen.Allerdings können Sie Ihre Auswahl als eine Teilauswahl treffen", um ein auswählen, gibt nur die Zeilen, die Sie haben wollen.
UPDATE:
Aufgrund der Einschränkungen von MySQL ist dies nicht möglich, obwohl es funktioniert in anderen DBMS wie Oracle.
Eine Lösung wäre, eine Ansicht zu erstellen, die für die Unterabfrage. Eine andere Lösung scheint cleaner:
Diese erklären die Ansicht, wie wenn nur die Spalten
userid
undmacs
obwohl die zugrunde liegendenSELECT
- Anweisung gibt mehr Spalten, als diese beiden.Obwohl ich mir nicht sicher bin, ob die nicht-DBMS MySQL unterstützt oder nicht...