nikoo: Hilfe beim Select...

Guten Morgen!

Da mir hier ja schon desöfteren prima geholfen wurde, wende ich mich auch diesmal an die hiesigen Experten.
Ich glaube, mir ist schlichtweg eine bestimmte Select-Anweisung zu hoch.

Folgendes:
In meiner DB gibt es folgende relevante Spalten:
Die erste lautet "kategorie", die zweite lautet "typ" und trägt, je nach Datensatz die Kennziffern 1,2,3 oder 4.
Die dritte lautet ort, die vierte lautet name.

Die Datensätze sind immer wie folgt verbunden:
Die 1. Zeile enthält die Kategoriebezeichnung und die Spalte "typ" die Kennziffer 1, nicht aber den Ort oder Namen
Die 2. Zeile enthält die Kategoriebezeichnung, die Spalte "typ" die Kennziffer 2 und die Spalte "ort" den Ort, nicht aber den Namen
Die 3. Zeile enthält die Kategoriebezeichnung, die Spalte "typ" die Kennziffer 3 und die Spalte "ort" den Ort, nicht aber den Namen
Die 4. Zeile enthält die Kategoriebezeichnung, die Spalte "typ" die Kennziffer 4, die Spalte "ort" den Ort und die Spalte "Name" den Namen.

Wenn es eine Zeile mit Kennziffer 1 gibt, folgt stets in der nächsten Zeile der Datensatz mit Kennziffer 2, dann der Datensatz mit Kennziffer 3 und dann, mögliche mehrere Datensätze mit Kennziffer 4.

Beispiel
------------------------------------------------
kategorie   typ     ort      name
------------------------------------------------
Bäcker      1
Bäcker      2       Berlin
Bäcker      3       Berlin
Bäcker      4       Berlin   Adams
Bäcker      4       Berlin   Bertram
Bäcker      2       München
Bäcker      3       München
Bäcker      4       München  Meier
Bäcker      4       München  Muster

Jetzt soll zunächst nach der Kategorie, innerhalb der Kategorie nach Ort und dann nach Name sortiert werden, aber so, dass stets pro Datensatz/Zeile innerhalb der Kategorie die Zeilen 1-3 und dann die Datensätze mit der Ziffer 4 sortiert nach Namen erscheinen sollen.

Das Tabellenbeispiel oben, soll verdeutlichen wie es aussehen soll.
Der folgende Select führt mich leider nicht zum Ziel:

"SELECT * FROM daten ORDER BY kategorie ASC, typ ASC, ort ASC, name ASC"

Wer weiß Rat?

  1. Mahlzeit nikoo,

    In meiner DB gibt es folgende relevante Spalten:
    Die erste lautet "kategorie", die zweite lautet "typ" und trägt, je nach Datensatz die Kennziffern 1,2,3 oder 4.
    Die dritte lautet ort, die vierte lautet name.

    Die Datensätze sind immer wie folgt verbunden:
    Die 1. Zeile enthält die Kategoriebezeichnung und die Spalte "typ" die Kennziffer 1, nicht aber den Ort oder Namen
    Die 2. Zeile enthält die Kategoriebezeichnung, die Spalte "typ" die Kennziffer 2 und die Spalte "ort" den Ort, nicht aber den Namen
    Die 3. Zeile enthält die Kategoriebezeichnung, die Spalte "typ" die Kennziffer 3 und die Spalte "ort" den Ort, nicht aber den Namen
    Die 4. Zeile enthält die Kategoriebezeichnung, die Spalte "typ" die Kennziffer 4, die Spalte "ort" den Ort und die Spalte "Name" den Namen.

    OMG ... informiere Dich bitte *DRINGENDST* zum Thema "Normalisierung"!

    Ich würde Dir ungefähr folgende Struktur vorschlagen:

    Tabelle "Kategorie":

    ID | Name
    ---+-------
     1 | Bäcker

    Tabelle "Ort":

    ID | Name
    ---+--------
     1 | Berlin
     2 | München

    Tabelle "Person":

    ID | Kategorie_ID | Ort_ID | Name
    ---+--------------+--------+--------
     1 |            1 |      1 | Adams
     2 |            1 |      1 | Bertram
     3 |            1 |      2 | Meier
     4 |            1 |      2 | Muster

    Jetzt soll zunächst nach der Kategorie, innerhalb der Kategorie nach Ort und dann nach Name sortiert werden, aber so, dass stets pro Datensatz/Zeile innerhalb der Kategorie die Zeilen 1-3 und dann die Datensätze mit der Ziffer 4 sortiert nach Namen erscheinen sollen.

    Ausgehend von der o.g. Struktur könnte diese Abfrage brauchbare Ergebnisse liefern:

    SELECT k.Name AS Kategorie_Name  
    ,      o.Name AS Ort_Name  
    ,      p.Name AS Person_Name  
      FROM Person    AS p  
      JOIN Kategorie AS k ON p.Kategorie_ID = k.ID  
      JOIN Ort       AS o ON p.Ort_ID = o.ID  
     ORDER BY k.Name ASC  
    ,         o.Name ASC  
    ,         p.Name ASC
    

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Mahlzeit Ingrid,

      achja - und mit PHP hat das Problem nicht das Geringste zu tun ...

      MfG,
      EKKi

      --
      sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    2. yo,

      OMG ... informiere Dich bitte *DRINGENDST* zum Thema "Normalisierung"!

      die formale beschreibung der normalisierung mag nach bestimmten regeln ablaufen, die anwendung dieser regel und somit das resultierende daten-design ist aber stark individuell. und häufig wird bei dem normalisierungsprozess auf daten geschaut, die sich gleichen, um diese dann auszulagern. davon kann ich nur abraten, was gleich ist muss nicht dassselbe sein und darin besteht bezüglich normalisierung ein wesentlicher unterschied.

      auch wenn ich bei seinen beschreibungen dazu tendieren würde, dass sein design für !seine zwecke! nicht opitmal ist, wäre ich immer vorsichtig mit meinen aussagen bezüglich eines schlechten daten-design.

      Ilja

  2. Moin!

    EKKi hat ja schon alles gesagt. Zu Deiner eigentlichen Frage: Schonmal versucht die Spalten beim ORDER BY umzusortieren? Sieht eher so aus, als ob due die Staedte lieber vor dem Typ sortiert haben moechtest. Das behauptest Du jedenfalls in deiner Aufstellung.

    --
    "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
          - T. Pratchett
  3. Hi!

    Auch ich tendiere erst einmal zur Normalisierung, solange ich den Grund für dein seltsames Datenformat nicht kenne. Denn du verlässt dich auch noch auf etwas, dass per Definition nicht gegeben ist:

    Wenn es eine Zeile mit Kennziffer 1 gibt, folgt stets in der nächsten Zeile [...]

    Die Datensätze sind stets als unsortiert zu betrachten. Obwohl es (meist?/immer?) eine Möglichkeit der physikalischen Sortierung gibt, gibt dir kein DBMS eine Garantie, dass die Reihenfolge der Datensätze so bleibt wie sie ist.

    Lo!

  4. Beispiel

    kategorie   typ     ort      name

    Bäcker      1
    Bäcker      2       Berlin
    Bäcker      3       Berlin
    Bäcker      4       Berlin   Adams
    Bäcker      4       Berlin   Bertram
    Bäcker      2       München
    Bäcker      3       München
    Bäcker      4       München  Meier
    Bäcker      4       München  Muster

    Jetzt soll zunächst nach der Kategorie, innerhalb der Kategorie nach Ort und dann nach Name sortiert werden, aber so, dass stets pro Datensatz/Zeile innerhalb der Kategorie die Zeilen 1-3 und dann die Datensätze mit der Ziffer 4 sortiert nach Namen erscheinen sollen.

    Das Tabellenbeispiel oben, soll verdeutlichen wie es aussehen soll.
    Der folgende Select führt mich leider nicht zum Ziel:

    "SELECT * FROM daten ORDER BY kategorie ASC, typ ASC, ort ASC, name ASC"

    Wer weiß Rat?

    Wenn ich dich richtig verstanden habe, vertasuche die Positionen von typ und ort also;
    "SELECT * FROM daten ORDER BY kategorie ASC, ort ASC, typ ASC, name ASC"
    denn ganz offensichtlich willst Du zuerst nach ort und dann nach typ sortieren.