PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   SQL / Datenbanken (https://www.php-resource.de/forum/sql-datenbanken/)
-   -   GROUP BY fehlende sortierung (https://www.php-resource.de/forum/sql-datenbanken/51902-group-by-fehlende-sortierung.html)

Beeper 15-03-2005 10:21

GROUP BY fehlende sortierung
 
Hallo,

habe ein kleines Problem und stehe gerade auf dem Schlauch.

Ich habe folgende Tabelle in gekürzter Form:

id | value | user | cat
1 | 100 | 1 | 1
2 | 50 | 2 | 2
3 | 60 | 3 | 3
4 | 150 | 4 | 1

jetzt möchte ich die ausgabe gruppieren nach "cat" und jeweils die zeile mit dem höchsten "value" haben.

ich habe bisher zwei abfragen probiert:
1.
PHP-Code:

SELECT
value
,user,cat
FROM
table
GROUP BY
cat
HAVING
value 
MAX(value

Hier ist das Problem, dass jetzt zB der Eintrag für "cat 1" kopmplett rausfällt, weil er zeile 1 auswählt, dort "value" aber nicht = MAX(value) ist, weil zeile 1 100 ist und MAX = 150.

2.
PHP-Code:

SELECT
max
(value),user,cat
FROM
table
GROUP BY
cat 

hier ist jetzt das problem, dass zwar alle max values angezeigt werden, aber nicht immer der richtige user, sonder für den max value = 150 wird jetzt user 1 ausgegeben.

Kann mir da bitte jemand helfen. Komme gerade nicht weiter, obwohl die Lösung eigentlich easy sein müsste.

danke.

asp2php 15-03-2005 10:33

du mußt ein self join (Join mit sich selbst) durchführen, mehr dazu: http://www.php-resource.de/forum/sho...threadid=28292

Beeper 15-03-2005 11:07

auf der seite stehen zwar viele hinweise zu joins, aber ich weiss jetzt trotzdem nicht genau, wie ich denn mit einem self join etwas anderes rausbekomme als vorher.

ich habe den self join eingebaut und dann wählt er ja die selben daten nochmal aus. wenn ich nun wieder die gruppierung mache, dann habe ich aber wieder die selben fehler wie oben gemacht.

welcher von beiden ansätzen oben ist denn korrekt? oder muß ich das komplett anders schreiben, wenn ich einen self join verwende.

asp2php 15-03-2005 11:31

probiere mal

Code:

select
  a.user, a.cat, max(a.`value`) mvalue
from `table` a left join `table` b
  on a.cat=b.cat and a.id<b.id
where
  b.id is null


goth 15-03-2005 11:40

Das ist halt der Mist wenn man 'ne Datenbank verwendet die fast alles toleriert ... und selbst keine ausreichende Disziplin besitzt valides ANSI-SQL zu verwenden ... dabei kann nur Schrott herauskommen ...

Wenn ich so einen Scheiss schon sehe ... Aggregieren ... und das Ergebnis einer Aggregatfunktion auf ein x-beliebiges sonstiges Attribut anwenden ... da kann nur Scheisse bei rauskommen ... auch wenn MySQL es akzeptiert ... (glücklicherweise gibt's auch dort mittlerweile 'nen ANSI-Mode) ...

Beeper 15-03-2005 11:58

ok, vielen dank, habe es hinbekommen. der code sieht jetzt folgendermaßen aus:

PHP-Code:

select 
   a
.usera.cata.value 
from 
`tablea left join `table
   on a
.cat=b.cat and a.value<b.value
where 
   b
.id is null 

musste nur noch value und id tauschen bei dem join. und max() ging ja gar, weil keine group by klausel vorhanden ist.

danke nochmal

asp2php 15-03-2005 12:01

hehe das max ist mir irgendwie darein gerutscht :dontknow: , eigentlich wollte ich wie du's geschrieben hast posten :)

@goth, schlecht geschlafen?


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:02 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG