Archiv verlassen und diese Seite im Standarddesign anzeigen : [SQL] geschachteltes SELECT mit mehreren Spalten
Ich will in einer Abfrage den Inhalt einer Tabelle nach drei Kriterien sortieren. Zwei davon sind Spalten der Tabelle, das dritte ist die Anzahl der Vorkommen einer bestimmten Spalte, also COUNT(sp3).
SELECT * FROM tabelle ORDER BY sp1, sp2 DESC, COUNT(sp3)Jetzt ist (My)SQL aber nicht gewillt, diese dritte Spalte zu zählen, während die anderen einfach so übernommen werden.
Mein Ansatz:
Ich wollte in einer eigenen Abfrage diese Spalte erzeugen, und sie dann einbauen.
(SELECT sp3, count(sp3) FROM tabelle GROUP BY sp3 ORDER BY 2)Problem: Ich brauche beide Spalten, um die COUNTs zuordnen zu können, kann aber im äußeren SELECT nur eine davon verarbeiten.
1. Kann man ein SELECT-Statement nicht wie eine beliebige Tabelle benutzen?
2. Kann man die Spalten des inneren SELECTs im äußeren referenzieren?
Hi sImOLf,
versuch doch mal
SELECT sp1, sp2, sp3,
COUNT (sp3) as anzahl
FROM tabelle;
@lizz
Ohne Aggregation (group by) dürfte das so nicht gehen.
Nicht laufzeitoptimal aber funktionierend sollts über korrelierte Subquery gehen:
Select sp1, sp2,
(Select Count(*) as sp3c from tabelle "inner" where inner.sp3 = outer.sp3)
From tabelle "outer"
Achtung: das oben ist MS-Sql Dialekt (bin kein mySQL'er).
Für mySQL ist die Syntax, um Tabellen Alias-namen zu geben, evtl. anders, z.B. tabelle as inner
Von der Laufzeit her besser, aber noch stärker dialektabhängig wäre ein Join (MS-Sql-Dialekt):
Select sp1, sp2, sp3c
From tabelle join (
Select sp3, Count(sp3) as sp3c from tabelle group by sp3
) mysubselect
on tabelle.sp3 = mysubselect.sp3
PS. könnte mal jemand die mySQL-Übersetzung posten?
Machs doch einfach so
SELECT sp1,sp2,count(sp3) AS zahl
FROM tabelle
ORDER BY sp1,sp2,zahl
@haggy (wie oben schon lizz):
Aus der Frage geht hervor, das für jeden sp3-Wert die Sätze mit genau dem sp3-Wert gezählt werden sollen.
Was ihr vorschlägt, zählt die sp3-Werte der gesamten Tabelle - ist was anderes.
//Hab mir mal die mySql-Doku geholt, liest hier sonst eigentlich jemand manuals?
Tschja sImOLf, bad luck:
mySql unterstützt weder Subqueries im Select noch im Join.
Bleibt dir also nichts anderes übrig, als über Hilfstabelle zu gehen, a la:
Delete Hilfstabelle
Insert into Hilfstabelle (sp3, sp3count)
Select sp3, Count(sp3) as sp3count From tabelle group by sp3
Select sp1, sp2, sp3count
From tabelle join hilftabelle on tabelle.sp3 = hilftabelle.sp3
Order by sp2, sp2, sp3count
Nachtrag @haggy, lizz : Zitat aus der mySql-Doku:
Note the use of GROUP BY to group together all records for each owner. Without it, all you get is an error message:
mysql> SELECT owner, COUNT(owner) FROM pet;
ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
with no GROUP columns is illegal if there is no GROUP BY clause
ja sorry - hatte das GROUP BY sp3; in der letzten Zeile vergessen.
Hatte das nicht mehr korrigiert, da du es ja bereits erwaehntest.
Danke fuer den Hinweis :-)