Filtern von Datensätzen

bakterius

Benutzer
Beiträge
6
Hallo zusammen

Ich steh mal wieder auf dem Schlauch und komme nicht weiter....

Meine DB sieht grob so aus:
Tabelle users (id, name, vorname)
Tabelle career (id, user_id, cat_id, datum, rank_id).
Tabelle ranks (id, name, kurzname, rang)

Mit dem SQL Statement kriege ich alle User aus der Tabelle users.

Code:
SELECT ranks.kurzname AS RangKurzname, ranks.rang, users.vorname, users.name FROM users
LEFT JOIN career ON career.user_id = users.id AND career.cat_id =3
LEFT JOIN ranks ON career.rank_id = ranks.id
WHERE users.deleted_at IS NULL
ORDER BY ranks.rang DESC, users.name ASC

Da in der Tabelle career jeweils mit der cat_id alle Beförderungen stehen und das pro User auch mehrere sein können, werden nun natürlich alle Daten zusammen ausgegeben.

Das sieht dann etwa so aus:
Lt 40 Daisy Duck
Wm 30 Daisy Duck
Wm 30 Micky Maus
Kpl 20 Daisy Duck
Kpl 20 Daniel Düsentrieb
Kpl 20 Micky Maus
Sdt 10 Daisy Duck
Sdt 10 Daniel Düsentrieb
Sdt 10 Micky Maus

Ausgeben will ich aber nur:
Lt 40 Daisy Duck
Wm 30 Micky Maus
Kpl 20 Donald Duck

Die Ränge lassen sich aus der Tabelle ranks über das Feld rang sortieren. Irgendwie muss ich die Daten noch so filtern, dass ich nur noch ein Datensatz pro User bekomme, jeweils denjenigen mit dem höchsten Rang.

Wer hilft mir auf die Sprünge?
 
Werbung:
Danke für Deine Antwort. Ja, Deal.

Ich versuche die Daten gefiltert aus der DB zu kriegen.
Mit dem SQL Statement oben, kriege ich die die Daten so raus.

Lt 40 Daisy Duck
Wm 30 Daisy Duck
Wm 30 Micky Maus
Kpl 20 Daisy Duck
Kpl 20 Daniel Düsentrieb
Kpl 20 Micky Maus
Sdt 10 Daisy Duck
Sdt 10 Daniel Düsentrieb
Sdt 10 Micky Maus

Rauskommen soll aber:
Lt 40 Daisy Duck
Wm 30 Micky Maus
Kpl 20 Donald Duck

Mein SQL Statement muss ich also so anpassen, dass ich die Daten entsprechend gefiltert bekomme. Jeder User soll nur einmal ausgegeben werden, zusammen mit dem aktuellen (höchsten) Rang.
Hoffe mein Problem ist nun verständlicher formuliert.
 
deine Beispiele sind schwer/nicht nachvollziehar.

Wenn ich Hilfe suchen würde, würde ich es den eventuellen Helfern so einfach wie möglich versuchen zu machen, mein Problem nachzuvollziehen, Wir hier müssen schon mal anfangen, die Teballenstruktur zu erraten. Hilfe für die, die dir helfen sollen, sieht andes aus.

Tut mir Leid, Andreas
 
Wir hier müssen schon mal anfangen, die Teballenstruktur zu erraten.
Die Tabellenstruktur steht doch da:

Meine DB sieht grob so aus:
Tabelle users (id, name, vorname)
Tabelle career (id, user_id, cat_id, datum, rank_id).
Tabelle ranks (id, name, kurzname, rang)

Grob deshalb, weil die Tabellen zum Teil weitere Spalten haben, Die sind hier aber nicht relevant. Bsp. enthält die Tabelle users Spalten wie E- Mail, etc.

Die Tabelle users enthält folgende Daten:
id name vorname
100 Duck Donald
123 Duck Daisy

Die Tabelle career enthält folgende Daten:
id user_id cat_id datum rank_id
1 123 3 01,01.2000 1
2 100 3 01.01.2001 1
3 123 3 01.01. 2003 2
4. 100 3 01.01.2015 2
5 123 3 01.01.2020 3

Die Tabelle rank enthält dann folgende Daten
id name kurzname rang
1 Soldat Sdt 10
2 Korporal Kpl 20
3 Leutnant Lt 30

Aufgrund der Joins in meiner Abfrage, kriege ich aber alle Kombinationen aus User und Rang. Ich möchte die Daten aber so filtern, dass jeder User nur einmal ausgegeben wird, jeweils mit dem Rang aus der Tabelle rank mit dem höchsten Wert in der Spalte rang. Sortiert nach ranks.rang und dann nach users.name.

Also so:
Lt 30 Daisy Duck
Kpl 20 Donald Duck

Ich hoffe, mein Problem ist nun klarer formuliert.
 
Werbung:
Hallo zusammen

Für diejenigen, welche evtl. vor einem ähnlichen Problem stehen.
Ich habe es mit Subseletcs gelöst.

Code:
SELECT users.name, users.vorname,
(
    SELECT rank_id FROM career
    WHERE career.user_id = users.id
    ORDER BY rank_id DESC
    LIMIT 1
) AS rank_id,
(
    SELECT kurzname FROM ranks
    WHERE ranks.id = rank_id
) AS kurzname,
(
    SELECT rang FROM ranks
    WHERE ranks.id = rank_id
) AS rang  
FROM users
WHERE users.deleted_at IS NULL
ORDER BY rang DESC, users.name, users.vorname

Vielen Dank an @akretschmer für den Versuch, mir zu helfen. Sorry, dass ich mein Problem nicht klarer formuliert habe.
 
Zurück
Oben