verschachtelte Abfrage
andreas
- datenbank
0 CHRISCHROS0 Frank (no reg)0 andreas0 Ilja0 Frank (no reg)0 Ilja
hallo zusammen,
ich habe ein Problem mit einer Abfrage die ich nicht hinbekomme. Bis jetzt sieht das so aus:
SELECT * FROM table_1
ORDER BY (
SELECT COUNT( * )
FROM table_2
WHERE tid=table_1.tid
)
LIMIT 0 , 10
tid ist eine id die in beiden Tabellen vorkommt (in table_1 einmalig). Abfragen möchte ich die Zeilen in table_1, geordnet nach der Anzahl Zeilen in table_2 mit der gleichen tid wie die jeweilige Zeile in table_1 enthält.
Ich benutze MySQL Version 5.x, verschachtelte Abfragen sind also möglich, nur mit der Syntax habe ich offensichtlich Mühe.
Um eine Hilfe wäre ich froh, ich habe dasselbe schon mit einer JOIN-Syntax versucht, aber auch ohne Erfolg.
hallo zusammen,
ich habe ein Problem mit einer Abfrage die ich nicht hinbekomme. Bis jetzt sieht das so aus:SELECT * FROM table_1
ORDER BY (
SELECT COUNT( * )
FROM table_2
WHERE tid=table_1.tid
)
LIMIT 0 , 10
Versuch mal
SELECT *
FROM table_1
LEFT JOIN table_2 ON table_1.tid = table_2.tid
Versuch mal
SELECT *
FROM table_1
LEFT JOIN table_2 ON table_1.tid = table_2.tid
Das funktioniert schon, nur ist dann das Ergebnis _nicht_ nach der Anzahl Zeilen in table_2 mit der gleichen tid sortiert.
Bei dieser Abfrage brauche ich die Felder der table_2 eigentlich gar nicht im Ergebnis, ich möchte eigentlich nur die Zeilen in table_1 nach Anzahl passenden Einträgen in table_2 sortieren.
Hi,
Das funktioniert schon, nur ist dann das Ergebnis _nicht_ nach der Anzahl Zeilen in table_2 mit der gleichen tid sortiert.
es fehlen ja auch noch mindestens die Sortierung und die Gruppierung.
Bei dieser Abfrage brauche ich die Felder der table_2 eigentlich gar nicht im Ergebnis,
Unter anderem deswegen wird nie, nie, nie außerhalb von Testfällen pauschal "*" selektiert. Gib *immer* genau die Spalten an, die Du erwartest.
Cheatah
es fehlen ja auch noch mindestens die Sortierung und die Gruppierung.
Ja und die Sortierung ist ja eben genau das Problem das ich nicht hinbekomme...
Unter anderem deswegen wird nie, nie, nie außerhalb von Testfällen pauschal "*" selektiert. Gib *immer* genau die Spalten an, die Du erwartest.
Ja gut, das stimmt. Die Abfrage habe ich hier Beispielhaft gepostet und beim Beispiel die Lesbarkeit maximiert um mein Problem zu beschreiben.
Hi,
es fehlen ja auch noch mindestens die Sortierung und die Gruppierung.
Ja und die Sortierung ist ja eben genau das Problem das ich nicht hinbekomme...
wenn Du die Werte hast, kannst Du nach ihnen sortieren. Hast Du die Werte?
Cheatah
wenn Du die Werte hast, kannst Du nach ihnen sortieren. Hast Du die Werte?
Cheatah
Hi Cheatah,
die Antwort von Frank hat geholfen. Mit einem INNER JOIN und Gruppierung wird das Ergebnis richtig sortiert.
Grüsse
andreas
yo,
Unter anderem deswegen wird nie, nie, nie außerhalb von Testfällen pauschal "*" selektiert. Gib *immer* genau die Spalten an, die Du erwartest.
sag niemals nie. es gibt einige situationen, in denen das * durchaus sinnvoll ist.
Ilja
Hallo Freunde des gehobenen Forumsgenusses,
Gib *immer* genau die Spalten an, die Du erwartest.
sag niemals nie. es gibt einige situationen, in denen das * durchaus sinnvoll ist.
Welche sind das denn (außer man will ein Export-Programm schreiben)?
Gruß
Alexander Brock
yo,
Welche sind das denn (außer man will ein Export-Programm schreiben)?
alleine dein 'außer' zeigt doch schon, dass hier das wort 'niemals' nicht angebracht ist. grundsätzlich kann man sagen, dass es dann eine sinnvolle anwendung gibt, wenn man alle spalten anzeigen lassen will, sich das tabellen-layout aber im laufe der zeit ändern kann.
Ilja
Hi,
wie sieht es mit folgendem SQL aus:
SELECT [table_1].[tid],
[table_1].[spalte1],
[table_1].[spalte2]
FROM [table_1] INNER JOIN
[table_2] ON [table_2].[tid] = [table_1].[tid]
GROUP BY [table_1].[tid],
[table_1].[spalte1],
[table_1].[spalte2]
ORDER BY COUNT(*) DESC
LIMIT 0, 10
Ciao, Frank
SELECT [table_1].[tid],
[table_1].[spalte1],
[table_1].[spalte2]
FROM [table_1] INNER JOIN
[table_2] ON [table_2].[tid] = [table_1].[tid]
GROUP BY [table_1].[tid],
[table_1].[spalte1],
[table_1].[spalte2]
ORDER BY COUNT(*) DESC
LIMIT 0, 10
Hallo Frank,
das scheint zu funktionieren. Im Nachhinein scheint mir das auch logisch, allerdings wäre ich nicht selber darauf gekommen, dass COUNT(\*) in dieser notation die Gruppengrösse zählt.
vielen Dank!
yo,
SELECT [table_1].[tid],
[table_1].[spalte1],
[table_1].[spalte2]
FROM [table_1] INNER JOIN
[table_2] ON [table_2].[tid] = [table_1].[tid]
GROUP BY [table_1].[tid],
[table_1].[spalte1],
[table_1].[spalte2]
ORDER BY COUNT(*) DESC
LIMIT 0, 10
bei mysql mit seiner version kann man sich die gruppierungen nach der tid sparen. auch wird die lösung nicht funktioniren, sobald spalten aus der zweiten tabelle mit ausgegeben werden sollen. ist dies der fall, könnten korellierende unterabfragen zum einsatz kommen.
Ilja
yo-yo ...
du solltest dir die Frage stellen, welche Ergebnismenge du (nicht du selber in dem Moment) zählen willst. Daraus leitest du die Beschreibung der Ergebnismenge ab.
In deinem Fall, Ilja, angenommen, du hast in table_2 10 Records die über [tid] mit table_1 in Zusammenhang stehen. Welche Spalte aus welchen dieser 10 Records willst du denn dann anzeigen?
Dein Vorschlag führt zu einer Veränderung der Aufgabenstellung. Und mit einer anderen Aufgabenstellung muss mein SQL Angebot nicht das richtige sein.
Das Group-By kann man sich sparen? Warum, macht das MySQL automatisch indem es implizit nach allen Spalten gruppiert? Das ist aber nicht gerade ANSI-SQL-92 Standard oder?
Ciao, Frank
yo,
SELECT [table_1].[tid],
[table_1].[spalte1],
[table_1].[spalte2]
FROM [table_1] INNER JOIN
[table_2] ON [table_2].[tid] = [table_1].[tid]
GROUP BY [table_1].[tid],
[table_1].[spalte1],
[table_1].[spalte2]
ORDER BY COUNT(*) DESC
LIMIT 0, 10
>
> bei mysql mit seiner version kann man sich die gruppierungen nach der tid sparen. auch wird die lösung nicht funktioniren, sobald spalten aus der zweiten tabelle mit ausgegeben werden sollen. ist dies der fall, könnten korellierende unterabfragen zum einsatz kommen.
>
> Ilja
>
>
yo,
Dein Vorschlag führt zu einer Veränderung der Aufgabenstellung. Und mit einer anderen Aufgabenstellung muss mein SQL Angebot nicht das richtige sein.
ist nur als hinweis gedacht, den man im auge behalten sollte, falls er mal spalten der zweiten tabelle mit einbringen will. solange nur spalten der ersten tabelle angezeigt werden, so funktioniert deine lösung.
Das Group-By kann man sich sparen? Warum, macht das MySQL automatisch indem es implizit nach allen Spalten gruppiert? Das ist aber nicht gerade ANSI-SQL-92 Standard oder?
nein, nicht den ganzen GROUP BY. aber nachdem du schon nach der ID in der ersten tabelle gruppierst, sprich jeder datensatz der ersten tabelle kommt in eine eigene gruppe, kannst du dir laut mysql (nicht ANSI) den rest der gruppierung sparen.
ob das nun sinnvoll ist, weil es mehr verwirrt, lass ich mal dahingestellt. aber es sollte syntaktisch funktionieren und die abfrage schneller machen.
Ilja