Ankündigung

Einklappen
Keine Ankündigung bisher.

PostgreSQL, order by, 2 Teile

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PostgreSQL, order by, 2 Teile

    Guten Abend,

    ich stehe von einem üblichen Problem. Ich möchte aus einer Datenbanktabelle Daten (in meinem Fall Nahrungsmittel) auslesen und in einer für mich richtigen Reihenfolge sortieren.
    Das "Problem" ist, ich möchte 2 Teile sortiert haben, in der Tabelle sind Einträge von unterschiedlichen Nutzern, zu unterscheiden in der Spalte 'creator_id'.
    Nun möchte ich als erstes alle eigenen Einträge sortiert nach der Spalte 'name' haben und dann nachfolgend alle anderen Einträge ebenfalls sortiert nach 'name'.
    Gibs dafür eine elegante Lösung in einer Abfrage?

    Meine Alternative ist sonst eben 2 Abfragen, erst die eigenen, dann alle anderen.

    Liebe Grüße
    ChromOxid

  • #2
    Grad etwas müde schon, ev. hilft dir davon was: https://php-de.github.io/jumpto/sql-special-sort/
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Ja, der Teil "Blockweise Sortierung nach einem Wert je Block" trifft den Nagel auf den Kopf, danke.

      Kommentar


      • #4
        Wenn es schon mal um postgres geht, dann schlage ich vor, Window Functions zu verwenden:
        PHP-Code:
        -- Ausgabe nach minimaler Deadline und Kunde sortiert  
        SELECT a
        .kunde_idk.namea.produkta.deadline,
               
        min(a.deadline)
                 
        over (partition by a.kunde_idk.name
                           order by a
        .deadline asc)
                 as 
        absoluteDeadline
          FROM Kunde k   
         INNER
          JOIN auftrag a
            ON k
        .id a.kunde_id
         GROUP BY a
        .kunde_idk.namea.produkta.deadline
         ORDER BY absoluteDeadline
        ,kunde_id,deadline
         
        -- Nutzung von  a.kunde_id statt k.id nur wegen Lesbarkeit 
        Ich habe in sqlfiddle ein Beispiel analog zum Link von hausl gemacht:
        http://sqlfiddle.com/#!15/33ccc/2

        Das Ganze sollte einen besseren Ausführungsplan liefern und ist etwas kompakter im Statement. Also für große Datenmengen hoffentlich besser geeignet.
        Würde mich interessieren, ob ChromOxid das am seinen Daten nachvollziehen kann, auch was zusätzliche Filterangaben angeht.

        Kommentar


        • #5
          Danke für die ausführliche Antwort, ich wünsche erstmal ein frohes Osterwochenende und melde mich danach nochmal bezüglich meiner Umsetzung.

          Kommentar


          • #6
            Perry Staltic Leider komme ich mit der Übertragung auf meinen Fall nicht wirklich zu Recht. Im Weg steht mir in erster Linie, dass ich Aggregatfunktion in meiner Sortierung drin habe. Zusätzlich dachte ich durch kein Join in der Abfrage wird mir die Übertragung einfacher Fallen, hier ist aber eher gegensätzliches der Fall.

            Inzwischen zweifle ich auch doch etwas daran, dass der Link so genau getroffen hat was ich wollte.
            Hier mal ein SQL Fiddle mit der Tabellenstruktur und Beispieleinträgen: http://sqlfiddle.com/#!15/b5cf7/2/0

            sortiert mit einem Kriterium (name) kommt sowas bei raus:

            Code:
            creator_id    name
            2    brot
            1    käse
            1    schinken
            3    wein
            2    wurst
            Ziel ist aber sowas:

            Code:
            für creator 1:
            creator_id    name
            1    käse
            1    schinken
            2    brot
            3    wein
            2    wurst
            
            für creator 2:
            creator_id    name
            2    brot
            2    wurst
            1    käse
            1    schinken
            3    wein
            
            usw.

            Kommentar


            • #7
              PHP-Code:
              ORDER BY CASE WHEN creator_id $creator_id THEN 0 ELSE 1 ENDname 

              Kommentar


              • #8
                Damit ist das dann wohl erledigt, oder?
                Die Umsetzung mit Postgres Window Functions widmet sich der allgemeinen Sortierproblematik Blockweise Sortierung nach einem Wert je Block

                von hausl. Ich hatte nach Deiner Antwort, das würde genau passen, nicht mehr wirklich Deinen Eröffnungspost gelesen.

                Kommentar


                • #9
                  Ja ist erledigt, danke erc.
                  Perry Staltic Entschuldige bitte, ich hätte wohl vorher ausprobieren sollen, ob das meine Anforderungen wirklich erfüllt, ich danke dir trotzdem für deine Mühe und hoffe zeitnah auch mal eine window function anwenden zu können.

                  Kommentar


                  • #10
                    Kein Problem, vielleicht nützt es jemand anderem, ist ja allgemein einsetzbar wie die Version für mySQL.

                    Kommentar

                    Lädt...
                    X