Problem bei der Sortierung der Ausgabe der Daten

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

  • Problem bei der Sortierung der Ausgabe der Daten

    Hallo an alle

    Das ganze Wochende habe ich das Forum als Gast durstöbert aber leider keine Lösung für mein Problem gefunden. Ich hoffe dass mir jemand helfen kann.

    Ich habe eine Datenbank für rollstuhlgerechte Angebote mit folgender Struktur:

    `id` int(11) NOT NULL auto_increment,
    `kat_id` varchar(10) NOT NULL default '',
    `bezeichnung` varchar(200) NOT NULL default '',
    `name` varchar(250) NOT NULL default '',
    `adresse` varchar(250) NOT NULL default '',
    `plz` varchar(4) NOT NULL default '',
    `ort` varchar(200) NOT NULL default '',
    `tel` varchar(50) NOT NULL default '',
    `fax` varchar(50) NOT NULL default '',
    `email` varchar(100) NOT NULL default '',
    `web` varchar(100) NOT NULL default '',
    `info` text NOT NULL,
    `suchbegriffe` text NOT NULL,
    `parken` char(1) NOT NULL default '',
    `parken_info` varchar(100) NOT NULL default '',
    `zugang` char(1) NOT NULL default '',
    `zugang_info` varchar(100) NOT NULL default '',
    `wc` char(1) NOT NULL default '',
    `wc_info` varchar(100) NOT NULL default '',
    `tische` char(1) NOT NULL default '',
    `tische_info` varchar(100) NOT NULL default '',
    `bad` char(1) NOT NULL default '',
    `bad_info` varchar(100) NOT NULL default '',
    `pool` char(1) NOT NULL default '',
    `pool_info` varchar(100) NOT NULL default '',
    `strand` char(1) NOT NULL default '',
    `strand_info` varchar(100) NOT NULL default '',
    `see` char(1) NOT NULL default '',
    `see_info` varchar(100) NOT NULL default '',
    `datum` varchar(10) NOT NULL default '',
    `klicks` varchar(250) NOT NULL default '',
    `geprueft` char(1) NOT NULL default '',
    `online` char(1) NOT NULL default '',
    `pass` varchar(50) NOT NULL default '',
    `aktiv` char(1) NOT NULL default '',

    die Felder parken,zugang,wc,tische,bad,pool,strand und see werden beim Eintragen mit 0,1 oder 2 gefüllt.

    0 steht für nicht rollstuhlgerecht
    1 steht für rollstuhlgerecht
    2 steht für nicht vorhanden

    Die Ausgabe der Einträge habe ich so gemacht:

    $abfrage = "SELECT * FROM eintraege WHERE kat_id='$rubrik' ORDER BY geprueft DESC, klicks DESC";
    $ergebnis = mysql_query($abfrage);
    while($row = mysql_fetch_object($ergebnis))
    {
    $id=$row->id;
    $bezeichnung=$row->bezeichnung;
    .......


    Das funktioniert auch aber ich muss auch die oben genannten Felder bzw. deren Inhalt berücksichtigen.
    Es sollen also die Einträge mit den meisten 1 am Anfang stehen dann die mit 2 und dann erst die mit 0

    Ich hoffe ich habe mich halbwegs verständlich ausgedrückt und ihr versteht mein Problem.

    Gruß und vielen Dank im voraus
    Rollimen

  • #2
    Sortiere zusätzlich nach der Summe dieser Felder.

    SELECT ... ORDER BY ..., (parken + zugang + wc + tische + bad + pool + strand + see) DESC

    oder

    SELECT ..., (parken + zugang + wc + tische + bad + pool + strand + see) AS score ... ORDER BY ..., score DESC


    Edit: Jetzt sehe ich erst, dass du Datensätze mit vielen Einsen vor denen mit vielen Zweien haben willst. Dann klappt das mit dem Summieren nicht.
    Kannst du die Bedeutung von Einsen und Zweien austauschen? Es leuchtet nämlich nicht ein, warum Einsen besser sind als Zweien und Zweien besser als Nullen.
    Zuletzt geändert von onemorenerd; 26.04.2010, 12:17.

    Kommentar


    • #3
      Und mir leuchtet nicht ein, warum kat_ids, einsen, nullen und zweien keine Zahlen sind. Warum verwendest du als "nicht vorhanden" kein NULL? Denn NULL kennzeichnet exakt das nichtvorhandensein eines Wertes.
      Wir werden alle sterben

      Kommentar


      • #4
        Hmm, ja, klar, ich versteh im Moment kein Wort aber egal.

        Folgendes noch zur Erklärung

        Priorität bei der Sortierung - vorhanden und rollstuhlgerecht, nicht vorhanden und vorhanden aber nicht rollstuhlgerecht.

        @ combie
        Wenn jetzt ein Feld den Wert NULL und keine Zahl hat wie kann ich das dann mit den Einträgen mit einer Zahl vergleichen und was hat das mit kat_id zu tun ?

        @ onemorenerd
        Die "3. Option" ist erst zum Schluss dazugekommen weil ich vergessen habe dass es ja sein kann dass etwas garnicht vorhanden ist, daher die "2". Natürlich könnte ich es komplett umändern aber ich habe gehofft dass mir das erspart bleibt.

        Kommentar


        • #5
          und was hat das mit kat_id zu tun ?
          Die kat_id ist doch sicherlich auch numerisch? Oder?
          Darf man dich nicht auf weitere Fehlerquellen hinweisen?

          Ich halte es für einen extremen Fehler, Felder welche nur rein numerisch sein können in String Felder zu packen.


          Code:
          ORDER BY FIELD(`parken`,1,2,0)
          oder nach der Korrektur:
          Code:
          ORDER BY FIELD(`parken`,1,2,NULL)
          Wir werden alle sterben

          Kommentar


          • #6
            nein, das sollte keine Kritik sein, ich wollte es nur wissen.

            Die kat_id habe ich als Stringfeld gewählt weil ich noch nicht weis ob in Zukunft nicht noch weitere Kategorien dazu kommen und es kein "NULL" gibt weil jede Kategorie ein ID hat.

            Du meinst also ich sollte es von VARCHAR in CHAR ändern? versteh ich das richtig ?

            Wie würde dann das ORDER BY FIELD weiter aussehen ORDER BY FIELD ('parken',1,2,NULL,'eingang',....) ASC/DESC oder muss jedes Feld einzeln angesprochen werden und ist die Reihenfolge 1,2,NULL auch die REihenfolge der Sortierung ?

            Kommentar


            • #7
              Die kat_id habe ich als Stringfeld gewählt weil ich noch nicht weis ob in Zukunft nicht noch weitere Kategorien dazu kommen und es kein "NULL" gibt weil jede Kategorie ein ID hat.
              Du setzt das Dinge in Beziehung zu einander, die nix, aber auch nix miteinander zu tun haben.
              Z.B. woher weißt du, dass man Stringfelder nicht auf NULL setzen kann?

              Du meinst also ich sollte es von VARCHAR in CHAR ändern? versteh ich das richtig ?
              Ist CHAR numerisch?
              (Grrrr)

              oder muss jedes Feld einzeln angesprochen werden
              ja

              und ist die Reihenfolge 1,2,NULL auch die REihenfolge der Sortierung ?
              Rate mal...
              Oder schau mal ins MySQL Handbuch...
              Oder probiers einfach aus...


              PS:
              ORDER BY FIELD ('parken',
              Wenn ich parken in Backticks setze, dann meine ich auch Backticks und keine Anführungszeichen.

              (sorry, dass ich etwas genervt klinge, ich halte mich jetzt auch hier raus)
              Zuletzt geändert von combie; 26.04.2010, 13:15.
              Wir werden alle sterben

              Kommentar


              • #8
                Okay, das mit dem NULL habe ich hab ich verstanden, habe diese Option nur noch nie verwendet.

                Verratest du mir bitte warum das aber so wichtig ist zumal ja die kat_id weder NULL noch leer sein darf (wird auch vor dem speichern geprüft)?

                Ich finde im deutschen MySQL-Handbuch auch keine Erklärung zu Feldern mit rein numerischen Inhalt, warum ist das deiner Meinung nach ein schwerer Fehler ?

                Ich möchte deiner Meinung nicht widersprechen, ich wüsste nur gerne warum es so ist.

                Im übrigen "probiere" ich schon einige Zeit rum da ich aber damit zu keiner Lösung gekommen bin habe ich mein Problem ja hier gepostet.

                Es tut mir leid dass du genervt bist aber warum antwortest du dann eigentlich auf ein Posting wenn dir die Geduld dazu fehlt ? Bitte nicht falsch verstehen. Das mit ' statt ` war nicht bewusst, sorry.
                Zuletzt geändert von Rollimen; 26.04.2010, 13:43.

                Kommentar


                • #9
                  So, das eigentliche Problem habe ich jetzt mal gelöst, die Daten werden nun in der richtigen Reihenfolge ausgegeben.

                  Ich habe wie empfohlen, 1 und 2 vertauscht und mit dem Tipp von onemorenerd (SELECT ... ORDER BY ..., (parken + zugang + wc + tische + bad + pool + strand + see) DESC) die Abfrage erweitert und alles klappt, Danke

                  Was die anderen Fragen bzw. mögliche Fehler betrifft so würde ich gerne noch die Antworten erfahren.

                  Kommentar


                  • #10
                    Okay, das Sortierproblem ist jetzt gelöst. Nun kümmern wir uns mal um die Designfehler.

                    Die Spalten parken, zugang etc. hast du alle als CHAR(1) definiert. Du speicherst aber nur Zahlen in diesen Spalten, keine Buchstaben oder sonstige Zeichen. Demnach wäre der korrekte Datentyp für diese Spalten INT, nicht CHAR.

                    Die Spalte kat_id hast du als VARCHAR(10) definiert. Falls deine Kat_IDs nur Zahlen enthalten, solltest du diese Spalte ebenfalls als INT definieren.

                    In den Spalten parken, zugang etc. speicherst du 0, 1 oder 2. Ich vermute mal, diese Zahlen stehen im weitesten Sinn für "ja", "nein" und "keine Angabe". Die Werte 0 und 1 sind okay, aber für "keine Angabe" solltest du NULL speichern. Das ist in SQL explizit dafür vorgesehen (dreiwertige Logik -> Google).

                    Last but not least wirkt das DB-Schema nicht ganz normalisiert (Normalisierung -> Google). Das ist jetzt nur eine Vermutung, da ich deine Applikation nicht kenne, aber möglicherweise sollten die Felder parken, zugang etc. sowie deren *_info-Kompanions in eine separate Tabelle ausgelagert werden.

                    Kommentar


                    • #11
                      Die Spaltentypen habe ich bereits geändert, habe über Google eine Seite gefunden auf der die einzelnen Typen genau erklärt sind und habe nun auch verstanden wie bzw. warum.

                      Das mit dem Wert NULL muss ich mir mal genauer anschauen, ich will nicht etwas ändern weil es jemand sagt sondern weil ich es verstanden habe warum es so sein soll, nicht falsch verstehen.

                      Last but not least wirkt das DB-Schema nicht ganz normalisiert (Normalisierung -> Google). Das ist jetzt nur eine Vermutung, da ich deine Applikation nicht kenne, aber möglicherweise sollten die Felder parken, zugang etc. sowie deren *_info-Kompanions in eine separate Tabelle ausgelagert werden.
                      Ich stimme dir zu dass diese Felder in einer eigenen Tabelle stehen könnten, was mir jedoch noch nicht ganz klar ist worin der Vorteil liegt. Dazu muss ich aber gestehen dass ich die kombinierte Abfrage bzw. Update zweier Tabellen noch nicht so ganz kapiert habe.

                      Ich lerne PHP zwar schon einige Zeit und habe schon einige Dinge gemacht aber da ich nicht gut englisch kann und anhand von Beispielen versuche die jeweiligen Funktionen zu verstehen, kommt es auch vor dass ich kein, für mich verständliches Beispiel finde oder halt die "Fehler" von anderen übernehme.

                      Kommentar


                      • #12
                        In der Regel ist es so, dass sich Design Fehler später schwer rächen!
                        1. sie machen die Abfragen komplizierter als nötig
                        2. bei späteren Erweiterungen der Tabellen müssen mehr Abfragen geändert werden
                        3. die Performance sinkt
                        4. die im DBMS eingebauten Optimierungen greifen nicht
                        5. du beißt dich selber später in den Hintern, wenn du den Code überarbeiten musst
                        6. deine Nachfolger schimpfen

                        Hier mal ein paar Links zum Thema:
                        MySQL :: MySQL 5.1 Referenzhandbuch :: 11 Datentypen
                        Die 5 Normal Formen
                        A Visual Explanation of SQL Joins
                        Wir werden alle sterben

                        Kommentar


                        • #13
                          Zu Punkt 1-4 kann ich nichts sagen aber da ich annehme dass du dich auskennst wird es sicher so sein.

                          Zu Punkt 5 kann ich nur sagen, aus Fehler lernt man und je mehr arbeit man wegen eines Fehlers hat desto sicher ist es dass man diesen Fehler nie wieder macht.

                          Zu Punkt 6 sage ich nur dass dies hier nicht zutrifft denn es ist nicht geplant dass es jemals einen Nachfolger geben wird (hat mit der Mentalität und der Einstellung der österreichischen Behinderten zu tun). Beider Rollstuhlseiten werden mit mir sterben.

                          Danke für die Links, den ersten kenne ich, den 2ten werde ich mir so schnell wie möglich anschauen. Beim 3ten Link habe ich das Problem dass meine Englisch-Kentnisse leider sehr mangelhaft sind aber ich habe da eine "deutsche" Seite gefunden die anscheinend mit Euren Tipps übereinstimmt und die Sachen einfach und leicht verständlich erklärt.

                          Falls jemand interesse hat hier der Link: http://www.peterkropff.de

                          Kommentar


                          • #14
                            Zitat von Rollimen Beitrag anzeigen
                            ich habe da eine "deutsche" Seite gefunden die anscheinend mit Euren Tipps übereinstimmt … http://www.peterkropff.de
                            Das könnte daran liegen, dass der Autor auch Moderator in diesem Forum ist. ;-)

                            Kommentar


                            • #15
                              und ich dachte schon dass ich mal was weis.

                              Kommentar

                              Lädt...
                              X