ORDER BY ignoriert mit GROUP BY
ORDER BY ignoriert mit GROUP BY
am 14.07.2007 14:56:06 von Alexander
Hallo,
ich habe zwei Tabellen (table1, welche die Haupttabelle darstellt und
table2, dessen Einträge sich auf table1 beziehen) welche ich mit einem
LEFT JOIN verknüpfen zu versuche.
Jetzt versuche ich alle Einträge aus table1 zu bekommen und zusätzlich
die Anzahl der zugehörigen aus table2, umgekehrt geordnet nach dem
table2 Timestamp jedoch um den "letzten" zu erhalten.
SELECT table1.*, table2.time, COUNT(table2.t1ref)
FROM table1
LEFT JOIN table2 ON table2.t1ref=table1.id
GROUP BY table1.id
ORDER BY table2.time DESC
Das Problem ist jedoch, daß beim Einsatz von GROUP BY offenbar die
Sortierung ignoriert wird und ich somit nicht den letzten Eintrag erhalte.
Hat jemand eine Idee wie man das lösen könnte?
Vielen Dank,
Alexander
Re: ORDER BY ignoriert mit GROUP BY
am 14.07.2007 15:12:25 von Michael Ziegler
Alexander wrote:
wer?
> ich habe zwei Tabellen (table1, welche die Haupttabelle darstellt und
> table2, dessen Einträge sich auf table1 beziehen) welche ich mit einem
> LEFT JOIN verknüpfen zu versuche.
Eine Tabellendefinition wäre schön. So kann ich nämlich nur raten bzw.
aus deinem Statement schlieÃen, wie deine Felder heiÃen.
> Jetzt versuche ich alle Einträge aus table1 zu bekommen und zusätzlich
> die Anzahl der zugehörigen aus table2, umgekehrt geordnet nach dem
> table2 Timestamp jedoch um den "letzten" zu erhalten.
Ich glaube hier wäre eher ein Subselect angesagt... ich hab das ganze
mal in einer meiner Datenbanken nachgespielt und bin zu folgendem
Ergebnis gekommen:
| SELECT `t1`.*, `t2`.*
| FROM `table1` `t1`
| INNER JOIN
| ( SELECT `t1ref`, COUNT(*) as `anzahl`, `time`
| FROM `table2`
| GROUP BY `t1ref`
| ORDER BY `time` DESC
| ) `t2`
| ON `t1`.`id` = `t2`.`t1ref`
| GROUP BY `t1`.`id`
Hoffe das funzt...
Michael
--
Testscript für RegEchsen:
http://diesundas.funzt-halt.net/regextest.php
Re: ORDER BY ignoriert mit GROUP BY
am 14.07.2007 15:20:57 von Michael Ziegler
Kleine Vorbemerkung:
Ich hab mich grade vertan, als ich nochmal geschaut hab ob das Statement
funzt, hab dann gedacht es funzt nicht und hab den Beitrag gecancelt.
Da es aber anscheinend doch funzt, hier nochmal der Beitrag von eben.
Bitte entschuldigt, falls ihr den Beitrag doppelt erhaltet :)
Michael
----
Alexander wrote:
wer?
> ich habe zwei Tabellen (table1, welche die Haupttabelle darstellt und
> table2, dessen Einträge sich auf table1 beziehen) welche ich mit einem
> LEFT JOIN verknüpfen zu versuche.
Eine Tabellendefinition wäre schön. So kann ich nämlich nur raten bzw.
aus deinem Statement schlieÃen, wie deine Felder heiÃen.
> Jetzt versuche ich alle Einträge aus table1 zu bekommen und zusätzlich
> die Anzahl der zugehörigen aus table2, umgekehrt geordnet nach dem
> table2 Timestamp jedoch um den "letzten" zu erhalten.
Ich glaube hier wäre eher ein Subselect angesagt... ich hab das ganze
mal in einer meiner Datenbanken nachgespielt und bin zu folgendem
Ergebnis gekommen:
| SELECT `t1`.*, `t2`.*
| FROM `table1` `t1`
| INNER JOIN
| ( SELECT `t1ref`, COUNT(*) as `anzahl`, `time`
| FROM `table2`
| GROUP BY `t1ref`
| ORDER BY `time` DESC
| ) `t2`
| ON `t1`.`id` = `t2`.`t1ref`
| GROUP BY `t1`.`id`
Hoffe das funzt...
Michael
--
Testscript für RegEchsen:
http://diesundas.funzt-halt.net/regextest.php
Re: ORDER BY ignoriert mit GROUP BY
am 14.07.2007 15:37:40 von Alexander
Michael Ziegler wrote:
>
> Eine Tabellendefinition wäre schön. So kann ich nämlich nur raten bzw.
> aus deinem Statement schlieÃen, wie deine Felder heiÃen.
Tut leid, hier eine abgespeckte Version mit den wichtigen Felder.
CREATE TABLE table1 (
`id` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`id`)
)
CREATE TABLE table2 (
`t1ref` int(10) unsigned NOT NULL default '0',
`time` int(10) unsigned NOT NULL default '0'
)
>
> Ich glaube hier wäre eher ein Subselect angesagt... ich hab das ganze
> mal in einer meiner Datenbanken nachgespielt und bin zu folgendem
> Ergebnis gekommen:
Ich verstehe, ich hoffte es wäre "einfacher" :)
>
> | SELECT `t1`.*, `t2`.*
> | FROM `table1` `t1`
> | INNER JOIN
> | ( SELECT `t1ref`, COUNT(*) as `anzahl`, `time`
> | FROM `table2`
> | GROUP BY `t1ref`
> | ORDER BY `time` DESC
> | ) `t2`
> | ON `t1`.`id` = `t2`.`t1ref`
> | GROUP BY `t1`.`id`
>
>
> Hoffe das funzt...
Leider nicht. Der gelieferte Timestamp ist nach wie vor nicht der letzte.
>
> Michael
>
Danke Michael,
Alexander
Re: ORDER BY ignoriert mit GROUP BY
am 14.07.2007 15:39:51 von Alexander
Michael Ziegler wrote:
>
> Kleine Vorbemerkung:
>
> Ich hab mich grade vertan, als ich nochmal geschaut hab ob das Statement
> funzt, hab dann gedacht es funzt nicht und hab den Beitrag gecancelt.
>
> Da es aber anscheinend doch funzt, hier nochmal der Beitrag von eben.
>
> Bitte entschuldigt, falls ihr den Beitrag doppelt erhaltet :)
>
> Michael
Kein Problem, danke nochmal.
Bitte sieh meine Antwort auf Dein Posting.
Alexander
Re: ORDER BY ignoriert mit GROUP BY
am 14.07.2007 15:57:04 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: ORDER BY ignoriert mit GROUP BY
am 14.07.2007 16:16:06 von Alexander
Andreas Kretschmer wrote:
>
> Entspricht folgendes Deinem Ziel:?
Hallo Andreas,
absolut!
Und Dein SQL Statement hat mir auch die Augen geöffnet. Statt einer
ORDER BY Klausel, ein MAX() auf den Timestamp
SELECT table1.*, MAX(table2.time), COUNT(table2.t1ref)
FROM table1
LEFT JOIN table2 ON table2.t1ref=table1.id
GROUP BY table1.id
Vielen Dank Andreas!!
Alexander