Hilfe beim Select...
nikoo
- php
0 EKKi0 EKKi- datenbank
0 Ilja
0 Steel0 dedlfix0 Texter mit x
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?
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
Mahlzeit Ingrid,
achja - und mit PHP hat das Problem nicht das Geringste zu tun ...
MfG,
EKKi
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
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.
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!
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 MusterJetzt 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.