Abfrage sortiert falsch ( bzw gar nicht)

Katzehuhn

Erfahrenes Mitglied
Ich hab hier diese Abfrage:

Code:
   SELECT feldtyp, typ, bild, mid
   FROM map
   LEFT  JOIN koordinaten ON map.mid = koordinaten.idfeldt
   JOIN mapeig
   WHERE map.fs_mapeig = mapeig.id
   AND (mid
   BETWEEN 30003 
   AND 30009 
   OR mid
   BETWEEN 40003 
   AND 40009 
   OR mid
   BETWEEN 50003 
   AND 50009 
   OR mid
   BETWEEN 60003 
   AND 60009 
   OR mid
   BETWEEN 70003 
   AND 70009 
   OR mid
   BETWEEN 80003 
   AND 80009 
   OR mid
   BETWEEN 90003 
   AND 90009 
   )
   GROUP  BY mid
   ORDER  BY mid, typ DESC
   LIMIT 49
Sie funktioniert soweit ganz gut, nur hab ich folgendes Problem:




KLeiner Ausschnitt der Ausgabe: ( kann man hier irgend wie Tabellen benutzen?^^)
feldtyp typ _bild ____mid
5 ____ 6__ Krieger__ 60004
5 ____ 6__ krieger__ 60005 .....
Mein Problem ist das er bei der Spalte "typ" nicht den kleinsten Wert raushohlt sondern nach der (in der Tabelle Koordinaten stehenden ID) sortiert.
Hab schon rumgetan wie ein verrückter, hab kurzzeitig auf MYSQL 5.0 gewechselt, hat aber leider nichts gebraucht. Er sortiert mir das alles noch immer falsch.
( Anmerkung: Wenn ich SELECT feldtyp, min(typ) as typ ...., oben hinschreibe stimmt zwar das Ergebnis bei "typ", bei Bild jedoch bleibt komischer Weise der alter Wert ( krieger) stehen)
Kann mir jemand helfen? Ich könnts zwar mit 2 Abfragen lösen nur hätt ich dann hohe Geschwindigkeitseinbussen. ( Sry für Rechtschreibfehler;) )
Danke
 
Zuletzt bearbeitet:
Das hilft mir leider nicht, jedenfalls check ichs nicht so ganz^^
Mein Problem ist, das er die mids auch von 1 bis n sortieren soll. Help plz^^
 
Was mich wundert, ist das dieser Query überhaupt ausgeführt wird :confused:
Aber das scheint an der Wunderwelt von MySQL zu liegen :p

Jedenfalls sollten alle selektierten Felder in irgendeiner Art und Weise aggregiert werden, da du eine GRuppierung verwendest.
Entweder, du schreibst alle Felder in den GROUP BY - Teil oder du nutzt Funktionen (MIN, MAX, COUNT, usw. um die Werte einzuschränken.
Bei Oracle oder SQL Server käme bei diesem Query eigentlich ein Fehler, da der niemand weiß, welcher Wert aus den vielen gruppierten Datensätzen angezeigt werden soll.
 
Katzehuhn hat gesagt.:
Mein Problem ist, das er die mids auch von 1 bis n sortieren soll. Help plz^^
Kannst Du das mal erläutern?

EDIT:
niggo hat gesagt.:
Bei Oracle oder SQL Server käme bei diesem Query eigentlich ein Fehler, da der niemand weiß, welcher Wert aus den vielen gruppierten Datensätzen angezeigt werden soll.
Die Erklärung, was MySQL daraus macht, steht im oben verlinkten Thread.
 
Vereinfachen wir das BSP mal:
Tabelle koordinaten:

id_typ_ idfeldt__bild
1 | 4 | 50005 | a
2 | 3 | 50005 | b
3 | 8 | 10001 | c
4 | 3 | 50005 | d
5 | 9 | 12 | e
10| 4 | 15 | f

Ich hab mir jetzt die anderen Seiten durchgeschaut, nur leider bin ich zu blöd diese sortier/gruppierungs-Funktion hier anzuwenden^^.
Ich will das er es nach dem idfeldt gruppiert und nach typ sortiert. DH bei typ soll der niedrigste Wert dargestellt werden.
(hab http://www.tutorials.de/tutorials213232.html ein bisschen herumgeschaut, leider bekomm ich das einfach nicht hin)
Wäre nett wenn ihr mir dabei einwenig helft:)
 
Code:
select 
  a.id,
  a.typ,
  a.idfeldt,
  a.bild
from koordinaten a
LEFT JOIN koordinaten b 
  ON a.idfeldt = b.idfeldt
   AND a.typ > b.typ
WHERE b.id IS NULL;
Weitere Bedingungen sind beim ON anzufügen und nicht im WHERE-Teil.

Gruß hpvw
 
So hatte ich das auch schon, nur gestern hat sich die Abfrage aufgehängt weil die Datenbank zu groß war. (hab Testweise 17000 Datensätze hinzugefügt gehabt).
Diese Art von Abfragen sind sehr Performence-Lastig oder? Wenn dann muss ich die Abfrage halt auf 2 trennen.
Wenn das bei jemanden doch funktioniert und ich mich nur zu blöd anstell entschuldige ich mich hier gleich mal;)
und danke hpvw für die hilfe^^
 
hpvw hat gesagt.:
EDIT:Die Erklärung, was MySQL daraus macht, steht im oben verlinkten Thread.
Das ist aber unsinnig, was MySQL da macht. Da es reiner Zufall ist, was man in dem Fall als Ergebnis bekommt, kann man auch ganz gut drauf verzichten.
Da finde ich, das, was bei "ausgewachsenen" DBMS gemacht wird (so wie oben beschrieben) eindeutig besser und sinnvoler. Außerdem könnt ich mir vorstellen, dass das nicht ganz SQL-konform ist (ohne jetzt nachzulesen)
 

Neue Beiträge

Zurück