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