Join: nach 2 Werte ordnen

Danny77

Aktiver Benutzer
Beiträge
26
Hallo,
ich habe bereits in einem PHP-Forum gefragt, sind aber leider nicht auf die Lösung gekommen, deshalb würde ich es gerne hier nochmals versuchen.
Ich habe 2 tabellen in meiner Datenbank. Eine Tabelle mit allen Kunden Daten und eine Tabelle mit allen Verkäufen.
Beide Tabellen verbinde ich mit Join an der client id.

Nun möchte ich alle Verkäufe inklusive der Kunden Daten in einer Html Tabelle ausgeben, allerdings geordnet nach Datum(dateneed Tabelle: Verkäufe) und nach Kunden(Tabelle Kundendaten).
z.b:
Kunde 2 - heute
Kunde 2 - übermorgen
Kunde 1 - morgen
Kunde 1 - übermorgen

habe es bereits so versucht:

SELECT Ku.Name, Ku.Straße, Ku.Ortschaft, Ku.vertreterid, ka.idkunde, ka.dateverkaufkunde, ka.mengeneed, ka.productneed, ka.dateneed

FROM Ku

INNER JOIN ka ON Ku.id=ka.idkunde

WHERE Ku.vertreterid = :id

ORDER BY dateneed, ka.idkunde

LIMIT 50
Allerdings sieht das Ergebnis dann so aus:
Kunde 2 - heute
Kunde 1 - morgen
Kunde 2 - übermorgen
usw.
wenn ich zuerst nach ka.idkunde ordne dann nach dateneed sieht es so aus:
Kunde 1 - morgen
Kunde 1 - übermorgen
Kunde 2 - heute
Kunde 2 - übermorgen

Hier habe ich ein sqlliteonline erstellt:
https://sqliteonline.com/#fiddle-5874b024ae3e865a8d77c1b4e2fbd4a75ed31c61da25683447
 
Werbung:
Ich versteh Dein Problem nicht ganz. Die Sortierung in deinem Beispiel ist korrekt.
Wenn Du zwischen Auf- und Absteigend wechseln möchtest, kannst Du hinter die Spalte DESC schreiben, also z.B. : order by idkunde desc,dateneed
 
@drdimitri
Nein wie oben beschrieben sollte die Sortierung so sein:
Kunde 2 - heute
Kunde 2 - übermorgen
Kunde 1 - morgen
Kunde 1 - übermorgen

Ich zeige nochmal per Screenshot, dass es nicht richtig ist:
1 Screenshot:
Die Kunden sind nicht sortiert.
2 Screenshot:
Kunden sind sortiert, aber das Datum ist nur innerhalb der Kunden sortiert. Ho Peterr ist vor Anna Ho obwohl Anna Ho ein jüngeres Datum hat.
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    25,4 KB · Aufrufe: 6
  • Unbenannt2.png
    Unbenannt2.png
    26,5 KB · Aufrufe: 3
Geh einfach einen Schritt zurück und atme tief durch. Wenn Du zuerst nach Feld 1 absteigend und dann nach Feld 2 normal sortiert haben willst, dann sage das einfach. Sollte die DB nicht völlig geisteskrank sein (okay, Du hast MySQL..., da rechne mal lieber immer mit dem schlimmsten) sollte das dann stimmen.

Du speicherst Datumsangaben als 'morgen', 'übermorgen', 'heute', 'gestern'?

Dann nehme ich meine Aussagen zu MySQL natürlich zurück.
 
@akretschmer
Ja ich verwende MySQL.
Nein speichern tue ich die schon als normales Datum, wollte es nur vereinfacht darstellen.

Edit: Also das Datum Feld soll absteigend sein (jüngstes Datum oben älteste ganz unten), aber die namen sollen gruppiert bleiben egal welches Datum.
 
dann such Dir was aus...

Code:
test=*# select * from danny77 order by random();
 name  |  datum   
-------+------------
 maier | 2017-01-12
 anton | 2017-01-08
 maier | 2017-01-09
 anton | 2017-01-09
 anton | 2017-01-10
 anton | 2017-01-09
 zebra | 2017-01-09
 zebra | 2017-01-10
 zebra | 2017-01-11
 zebra | 2017-01-12
 maier | 2017-01-11
 maier | 2017-01-10
(12 Zeilen)

test=*# select * from danny77 order by name, datum;
 name  |  datum   
-------+------------
 anton | 2017-01-08
 anton | 2017-01-09
 anton | 2017-01-09
 anton | 2017-01-10
 maier | 2017-01-09
 maier | 2017-01-10
 maier | 2017-01-11
 maier | 2017-01-12
 zebra | 2017-01-09
 zebra | 2017-01-10
 zebra | 2017-01-11
 zebra | 2017-01-12
(12 Zeilen)

test=*# select * from danny77 order by name desc, datum;
 name  |  datum   
-------+------------
 zebra | 2017-01-09
 zebra | 2017-01-10
 zebra | 2017-01-11
 zebra | 2017-01-12
 maier | 2017-01-09
 maier | 2017-01-10
 maier | 2017-01-11
 maier | 2017-01-12
 anton | 2017-01-08
 anton | 2017-01-09
 anton | 2017-01-09
 anton | 2017-01-10
(12 Zeilen)

test=*# select * from danny77 order by name, datum desc;
 name  |  datum   
-------+------------
 anton | 2017-01-10
 anton | 2017-01-09
 anton | 2017-01-09
 anton | 2017-01-08
 maier | 2017-01-12
 maier | 2017-01-11
 maier | 2017-01-10
 maier | 2017-01-09
 zebra | 2017-01-12
 zebra | 2017-01-11
 zebra | 2017-01-10
 zebra | 2017-01-09
(12 Zeilen)

test=*# select * from danny77 order by datum desc, name;
 name  |  datum   
-------+------------
 maier | 2017-01-12
 zebra | 2017-01-12
 maier | 2017-01-11
 zebra | 2017-01-11
 anton | 2017-01-10
 maier | 2017-01-10
 zebra | 2017-01-10
 anton | 2017-01-09
 anton | 2017-01-09
 maier | 2017-01-09
 zebra | 2017-01-09
 anton | 2017-01-08
(12 Zeilen)

test=*# select * from danny77 order by datum desc, name desc;
 name  |  datum   
-------+------------
 zebra | 2017-01-12
 maier | 2017-01-12
 zebra | 2017-01-11
 maier | 2017-01-11
 zebra | 2017-01-10
 maier | 2017-01-10
 anton | 2017-01-10
 zebra | 2017-01-09
 maier | 2017-01-09
 anton | 2017-01-09
 anton | 2017-01-09
 anton | 2017-01-08
(12 Zeilen)

test=*# select * from danny77 order by datum asc, name desc;
 name  |  datum   
-------+------------
 anton | 2017-01-08
 zebra | 2017-01-09
 maier | 2017-01-09
 anton | 2017-01-09
 anton | 2017-01-09
 zebra | 2017-01-10
 maier | 2017-01-10
 anton | 2017-01-10
 zebra | 2017-01-11
 maier | 2017-01-11
 zebra | 2017-01-12
 maier | 2017-01-12
(12 Zeilen)
 
@akretschmer
Eben sind die alle falsch =).
Ich kopier nochmal mein Edit oben hier rein:
Also das Datum Feld soll absteigend sein (jüngstes Datum oben älteste ganz unten), aber die namen sollen gruppiert bleiben egal welches Datum.
Edit:
Die Namen müssen aber nicht absteigend sein oder sonst irgendwie sortiert, nur gruppiert.
Weis leider nicht wie ich das besser Erklären könnte tut mit Leid =).

Edit2:
Vom Prinzip würde dieses Beispiel stimmen:
test=*# select * from danny77 order by name, datum;
aber wenn ich bei maier das Datum des ersten Beitrages zu 2017-01-01 ändern würde müssten alle seine Einträge an erster Stelle sein.
 
Dein, Zitat:

===
Nun möchte ich alle Verkäufe inklusive der Kunden Daten in einer Html Tabelle ausgeben, allerdings geordnet nach Datum(dateneed Tabelle: Verkäufe) und nach Kunden(Tabelle Kundendaten).
z.b:
Kunde 2 - heute
Kunde 2 - übermorgen
Kunde 1 - morgen
Kunde 1 - übermorgen
===

ist nicht nach Datum sortiert. Beschäftige Dich bitte mit dem, was Du willst und werd Dir selber darüber erst einmal klar.
 
@akretschmer
Es ist doch nach Datum sortiert, nur dass die Kunden gruppiert sind ich mache ein weiters Beispiel mit Zahlen. 1-10, 1 steht für dem jüngsten Datum und 10 für das älteste.

Kunde3 - 1
Kunde3 - 7
Kunde1 - 2
Kunde1 - 6
Kunde5 - 3
Kunde5 - 9
Kunde4 - 4
Kunde4 - 6
Kunde9 - 5
Kunde9 - 9
 
wie kommst Du auf die Sortierung / Gruppierung der Kunden?

Ich biete:

Code:
test=*# select * from danny77 order by md5(name), datum;
 name  |  datum   
-------+------------
 zebra | 2017-01-09
 zebra | 2017-01-10
 zebra | 2017-01-11
 zebra | 2017-01-12
 anton | 2017-01-08
 anton | 2017-01-09
 anton | 2017-01-09
 anton | 2017-01-10
 maier | 2017-01-09
 maier | 2017-01-10
 maier | 2017-01-11
 maier | 2017-01-12
(12 Zeilen)
 
@akretschmer
Ja genau so was suche ich, scheint aber nicht zu funktionieren. oO

Edit:
Der erste Eintrag wird nicht angezeigt und die Kundengruppe mit dem jüngsten Datum ist auch nicht an erster Stelle.
Edit2:
Im Anhang noch ein Screenshot.

SQL:
SELECT Ku.Name, Ku.Straße, Ku.Ortschaft, Ku.vertreterid, ka.idkunde, ka.dateverkaufkunde, ka.mengeneed, ka.productneed, ka.dateneed
FROM Ku
INNER JOIN ka ON Ku.id=ka.idkunde
WHERE Ku.vertreterid = 10
ORDER BY md5(Ku.Name), dateneed
LIMIT 50

(Ku.Name ist der Name des Kunden habe es testweise geändert von [ka.idkunde])
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    217,8 KB · Aufrufe: 1
Zuletzt bearbeitet:
Werbung:
@akretschmer
habe ich mir fast schon gedacht =).

Eine andere Möglichkeit wird es doch bestimmt geben ?
Ich denke mein Problem müsste ähnlich sein wie das auf Stackoverflow hier:
MySQL GROUP BY two columns

Ich kopier es mal heraus:

select client_id, name, portfolio_id, cash + stocks
from client
join portfolio using(client_id)
join(select client_id, max(cash + stocks)as maxtotal
from portfolio
groupby client_id)as maxima
using(client_id)
where cash + stocks = maxtotal
groupby client_id, cash + stocks


Nur habe ich keine Ahnung was der da macht, habe es auch nicht hinbekommen.
 
Zurück
Oben