MySQL: Bei Sortierung leere Felder auslassen
chrigu
- datenbank
Hallo zusammen,
Ich möchte bei einer Datenbank-Abfrage die Felder sortiert ausgeben. Dazu benutze ich die ORDER BY Funktion. Es hat aber leider auch viele Felder, welche leer sind. Wenn ich nun sortiere kommen zuerst die leeren Felder, dann A-Z.
Wie schaffe ich es nun, zuerst A-Z und dann die leeren?
Gruss
Chrigu
Hi,
sollen die leeren Felder gar nicht mit aus der Datenbank geholt werden ?? Wenn ja, dann kannst du ja auch noch eine WHERE-Klausel einbauen, die halt leere Felder ignoriert.
mfg
ff
hi,
nein, die leeren felder sollen am schluss angezeigt werden, und nicht zu oberst!
Gruss
Chrigu
Hello,
hi,
nein, die leeren felder sollen am schluss angezeigt werden, und nicht zu oberst!
Dann müsstest Du wahrscheinlich einen alternate collating key vreinbaren.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Dann müsstest Du wahrscheinlich einen alternate collating key vreinbaren.
Ähm, könntest du das ein bisschen genauer erklären?
Gruss
Chrigu
Hello,
Dann müsstest Du wahrscheinlich einen alternate collating key vreinbaren.
Ähm, könntest du das ein bisschen genauer erklären?
Wo hast Du denn Verständnisschwierigkeiten? Gibt mir doch kur den Link des MySQL-manuals. Dann muss ich kir dies Stelle, die dier Schrierigkeiten macht, nicht nochmal selber suchen ;-))
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Ich habe Google danach befragt, die Such-Funktion auf mysql.com und bin auf keine Ergebnisse gestossen!
Das Problem ist, dass ich keinen Schimmer habe was ein "alternate collating key" und wie sowas aussieht..
Gruss
Chrigu
Hello,
Ich habe Google danach befragt, die Such-Funktion auf mysql.com und bin auf keine Ergebnisse gestossen!
Das Problem ist, dass ich keinen Schimmer habe was ein "alternate collating key" und wie sowas aussieht..
OK, das Dink heißt ja auch Alternate Collating Sequence, aber darauf wäre man nach dem ersten Google-Ergebnis auch gekommen...
Die Collataing Sequence ist letztlich das CharacterSet, nach dem eine Sortierungsreihenfolge bestimmt wird. Wenn man nun das Leerzeichen von seiner angestammten Position entfernt und an das Ende der Sequenz setzt, landen die Datensätze mit Leerzeichen eben auch am End der Sortierungsliste.
Viele Datenbanekn haben zudem noch eine zusätzliche Funktion für die Positionierung von leerzeichengefüllten Datensätzen. Könnte sein, dass MySQL auch eine hat.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
yo,
Die Collataing Sequence ist letztlich das CharacterSet, nach dem eine Sortierungsreihenfolge bestimmt wird. Wenn man nun das Leerzeichen von seiner angestammten Position entfernt und an das Ende der Sequenz setzt, landen die Datensätze mit Leerzeichen eben auch am End der Sortierungsliste.
nur das NULL felder eben keine leerzeichen haben...
Ilja
Hello,
Die Collataing Sequence ist letztlich das CharacterSet, nach dem eine Sortierungsreihenfolge bestimmt wird. Wenn man nun das Leerzeichen von seiner angestammten Position entfernt und an das Ende der Sequenz setzt, landen die Datensätze mit Leerzeichen eben auch am End der Sortierungsliste.
nur das NULL felder eben keine leerzeichen haben...
Danke für den Hinweis.
Dann müsste er vielleicht sogar zwei Abfragen machen und die dann extern zusammenführen?
Tabelle sperren
Alle Sätze im Filterbereich für die keine Leer und keine Nullfelder vorkommen
Alle Sätze im Filterbereich für die Leer und Nullfelder vorkommen
Tabelle freigeben.
Problem ist ben dabei, dass man für eine solche Spielerei locken muss.
Da fällt mir noch was anderes ein:
Das letzte Zeichen in der Normalen Sortierung ist doch in der Darstellung auch ein Leerzeichen, nämlich ein geschütztes. Nun kann man bei der Abfrage ein if für das betroffene Feld einbauen und wenn es leer oder NULL ist, dann setzt man einfach ein chr(255) davor. Damit landen diese Daensätze dann am Ende, wenn über das Feld sortiert wird.
Ist das nun ein gute oder schlechte Idee? Was hält den konkurrierenden Betrieb mehr auf? Die horizontale Bearbeitung, die ja die Performance der Abfrage in die Knie drückt, oder die Sperre der Tabelle(n) währen zweier hochperformanter Abfragen?
select ID_ADRESSE, if(isnull(FARB_NAME),char(255),FARB_NAME) as FARBE
from ADRESSE left join FARBE
using (ID_FARBE)
order by FARBE;
Allerdings liefert mir das char(255) im Screen das y mit zwei Punkten drüber . Liegt das nun am Windows-Zeichensatz? Auch wenn ich die ssh-Konsole nutze, habe ich das hässliche Zeichen in der Darstellung. Je mehr man ausprobiert, desto mehr Problemchen tauchen auf :-(
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
yo,
was soll ich sagen, deine beiden vorschläge (zwei abfragen oder null funktion)sagen mir natürlich zu, da ich sie selbst schon gepostet habe. ;-)
ich persönlich würde UNION benutzen, den gibt es aber unter mysql nicht. dann würde ich die NULL funktion einsetzen und am ende zwei abfragen.
Ilja
Hello,
was soll ich sagen, deine beiden vorschläge (zwei abfragen oder null funktion)sagen mir natürlich zu, da ich sie selbst schon gepostet habe. ;-)
Hab ich doch glatt übrsehen.
Welche der beiden Lösungen ist denn wohl billiger?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
yo,
Welche der beiden Lösungen ist denn wohl billiger?
solange du die funktion nicht in einer where klausel benutzt, sondern nur bei der ausgabe, die NULL funktion würde ich meinen. fragt sich, ob man so einen grossen datenbestand hat, dass es sich auswirkt....
Ilja
hi,
nein, die leeren felder sollen am schluss angezeigt werden, und nicht zu oberst!
ach so, ach so.
Wie wertest du denn dann deine Treffer aus ??
Du könntest ja z.B. alle Felder, die keinen Inhalt haben in ein Array schreiben und dieses dann nachdem alles andere angezeigt wurde auslesen und anzeigen.
$result = Datenbabfrage;
while($treffer = mysql_fetch_array($result))
{
if($treffer[feld_ohne_Inhalt] == "")
{
in Array schreiben
}
hier dann die Felder auswerten und anzeigen, die nen Inhalt haben
}
hier dann das Array durchlaufen und den Inhalt daraus anzeigen
mfg
ff
Hallo,
Eine ähnliche Variante wie die, mit dem Array habe ich mir auch schon überlegt. Leider geht das in meinem Fall nicht, da der Code vorgegeben ist quasi und ich die Ausgabe nicht einfach mal so ändern kann.
Darum wollte ich das ganze eigentlich im Query machen, damit ich die Struktur weiter unten nicht ändern muss!
Tja wenn es wirklich nicht geht, dann muss ich halt damit leben, dass zuerst die leeren Felder angezeigt werden, was irgendwie ziemlich doof ist ;))
Danke trotzdem für den raschen Support!!
Gruss
Chrigu
yo,
Wie schaffe ich es nun, zuerst A-Z und dann die leeren?
viele wege führe nach rom. unter oracle gibt es den schönen UNION operator, denke mal nicht, dass mysql den schon hat. wenn doch, beuntze den. ansonsten musst du entweder zwei abfragen draus machen und in der ersten alle null felder ausschliessen und in der zweiten nur null felder einbeziehen. oder aber du benutzt eine funktion, welche die entsprechende spalte auf NULL überprüft und dann entsprechend verzweigt. wenn sie null ist. ich kenne die funktion unter mysql nicht out of the head , aber bei oracle heisst sie NVL.
Ilja
Hello,
Ich möchte bei einer Datenbank-Abfrage die Felder sortiert ausgeben. Dazu benutze ich die ORDER BY Funktion. Es hat aber leider auch viele Felder, welche leer sind. Wenn ich nun sortiere kommen zuerst die leeren Felder, dann A-Z.
Wie schaffe ich es nun, zuerst A-Z und dann die leeren?
Indem Du dem Filter erzählst, dass es "leere" Felder auslassen soll.
Was ist "leer"
== ""
== NULL
== 0
...
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo Chrigu,
Ich möchte bei einer Datenbank-Abfrage die Felder sortiert ausgeben. Dazu benutze ich die ORDER BY Funktion. Es hat aber leider auch viele Felder, welche leer sind. Wenn ich nun sortiere kommen zuerst die leeren Felder, dann A-Z.
Wie schaffe ich es nun, zuerst A-Z und dann die leeren?
select feld, length(feld)/length(feld) as len from tabelle order by len desc, feld
Gruß Gonzman