Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Werte aus unterschiedlichen Spalten untereinander sortieren

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von alexfrenzel92, 27 September 2015.

  1. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Guten Abend miteinander,

    Ich habe mehrere Werte aus unterschiedlichen Spalten, gegebenenfalls aus mehreren Tabellen durch Joins.
    Kann ich den höchsten, zweithöchsten, etc. Wert aller dieser Spalten ausgeben? Sodass er mehrere Spalten in eine zusammenfügt und diese neue Spalte untereinander sortiert?

    mfg Danke
    Grüße
    Alex
     
  2. akretschmer

    akretschmer Datenbank-Guru

    In PostgreSQL:

    Code:
    test=*# select * from bla;
     c1  | c2  | c3  | c4
    -----+-----+-----+-----
      1 |  2 |  3 |  4
     150 | 140 | 130 | 120
      5 |  1 |  8 |  5
    (3 rows)
    
    Time: 0,162 ms
    test=*# select greatest(c1,c2,c3,c4), least(c1,c2,c3,c4) from bla order by greatest(c1,c2,c3,c4);
     greatest | least
    ----------+-------
      4 |  1
      8 |  1
      150 |  120
    (3 rows)
    
    Falls MySQL das mal wieder nicht kann: via einzelner UNION [ALL] - Abfragen die Werte in eine Spalte bringen und sortieren.
     
  3. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Stimmt, da war was. UNION ALL war das, was ich gesucht habe - Danke!:)
     
  4. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Oder auch nur fast - kann ich die sortierte neue Tabelle, die durch mehrere Selects, AS und UNION ALLs erstellt wurde auf eine bestimmte Zelle beschränken?

    Der Hintergrund ist der, dass ich den Wert dieser Zelle per INSERT in eine andere Tabelle einfügen will. Und INSERT braucht höchstens einen Wert, wenn er in eine bestimmte Zelle eingefügt werden soll.

    Das Problem ist, dass ich durch LIMIT und ORDER BY zwar die Zeile beschränken und bestimmen kann, jedoch mindestens zwei Spalten übrig bleiben (Die Spalte, deren Wert, den ich habe will und die Spalte, nach der sortiert wird und nach dem Wort benannt wird, die hinter dem AS steht)

    Danke nochmals im Vorraus
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Dann selektiere nur eine Spalte.
     
  6. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Die Spalte, nach der ich sortieren will muss ich selektieren, da sie dadurch erst zustande kommt.

    Code:
    Die Tabelle Spieler enthält die Spalten SpielerID, Stärke, Position und Nebenposition - Die Tabelle Übersicht enthält die Spalten SpielerID und Priorität.
    
    
    SELECT SpielerID, Stärke * 1 AS Gesamtstärke, Priorität FROM Übersicht INNER JOIN Spieler ON Übersicht.SpielerID = Spieler.ID WHERE Position = 1
    UNION ALL
    SELECT SpielerID, Stärke * 0,5 AS Gesamtstärke, Priorität FROM Übersicht INNER JOIN Spieler ON Übersicht.SpielerID = Spieler.ID WHERE Nebenposition = 1
    ORDER BY Stärke desc, Priorität asc
    Dadurch, dass ich nach mehreren Spalten sortieren will und überhaupt erst nach einer Spalte, die erzeugt wird und erst dann sortiert werden kann, weil sie dadurch die richtig errechneten Werte enthält. Ob ich Priorität selektieren muss weiß ich nicht aber Stärke * x AS Gesamtstärke muss ich selektieren
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Das ist unlogisch. Zum einen sagst Du: "den Wert dieser Zelle per INSERT in eine andere Tabelle einfügen will. Und INSERT braucht höchstens einen Wert, wenn er in eine bestimmte Zelle eingefügt werden soll." - es geht also um exakt einen konkreten Wert. Und dann sagst Du: "nach mehreren Spalten sortieren will und überhaupt erst nach einer Spalte, die erzeugt wird und erst dann sortiert werden kann, weil sie dadurch die richtig errechneten Werte enthält." - hier also mehrere Werte.

    Ausgehend von meinen Beispieldaten: welchen Wert suchst Du?
     
  8. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Das wär unlogisch, ja.
    In dieser Spalte gibt es natürlich mehrere Werte, aber nur einen Wert, der in der gleichen Zeile steht, wie der höchste Wert in einer anderen Spalte. Dazu kommt, dass die Spalte, nach der ich sortieren will die gleiche Spalte in verschiedenen Variationen (multipliziert mit jeweils 0,5, 1 , 0,75... je nach Zutreffen der WHERE-Klausel) enthält.

    Die Werte der Spalten, nach denen ich sortieren will, will ich gar nicht haben, sondern den Wert in der gleichen Zeile, die gemäß der Sortierung die oberste ist. Bei den errechneten Werten rede ich trotzdem nur von mehreren Werten in einer Spalte.

    Je nach dem, was in c3 steht, soll die Spalte c2 mit 0,5 oder 0,75 oder 1 multipliziert werden. Diese neue Spalte soll sortiert werden und ich suche den Wert aus c1 neben dem höchsten Wert dieser fiktiven Spalte
     
    Zuletzt bearbeitet: 28 September 2015
  9. akretschmer

    akretschmer Datenbank-Guru

    Du hast meine Bitte, ausgehend von meinen Beispieldaten zu zeigen, was Du suchst, nicht beantwortet. Ich rate einfach mal:

    Code:
    test=*# select case when c2 > 100 then c1 * 0.7 else c1 * 1.7 end from bla order by c4 desc limit 1;
     case
    -------
     105.0
    (1 row)
    
    Wie gesagt: ich kann nicht nachvollziehen, was Du genau suchst, denke aber: sobald man es beschreiben kann, findest sich auch das passende Select.
     
  10. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Habe ich gerade editiert und so gut wie ich konnte beantwortet
     
  11. akretschmer

    akretschmer Datenbank-Guru

    Dann ist ja prima, weil ich das faktisch beantwortet habe.
     
  12. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Dadurch, dass mein Beispiel JOINS und AS enthält, brauche ich gerade ein bischen, um deine Antwort umzusetzen. Ich denke, ganz wars das noch nicht, da manche Zeilen mehrmals enthalten sind. (Einmal dort, wo der Wert in der Spalte c1 (in meinem EDIT war es c2) mit 0,7 multipliziert wird und einmal, wenn sie mit 1,7 oder sonstwas multipliziert wird). Das ist notwendig, weil ich nicht nur die höchste Zeile, sondern beispielsweise auch die elf-höchste Zeile brauche
     
  13. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Am einfachsten wäre ein übergeordnetes SELECT, falls das möglich wäre.

    Jeder SELECT-Befehl erstellt ja eine Tabelle mit x Spalten. Wenn man da ein weiteres SELECT machen könnte:
    Code:
    SELECT Spalte1 FROM (SELECT...FROM...WHERE...) LIMIT 1
    wäre das alles überhaupt kein Problem. Geht sowas?
     
  14. alexfrenzel92

    alexfrenzel92 Datenbank-Guru

    Hat sich erledigt, es funktioniert. Ich habe, bevor ich den letzten Post geschrieben habe bei dem Versuch irgendetwas falsch gemacht.

    Code:
    SELECT Spalte1 FROM (SELECT...FROM...WHERE...) AS sonstwas LIMIT 1
    
    Danke für die Hilfe!!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden