Ankündigung

Einklappen
Keine Ankündigung bisher.

Tabelle nach Join sortieren

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

  • Tabelle nach Join sortieren

    Hallo zusammen,

    ich habe eine Datenbank, in der bestimmte Geräte über die id identifiziert werden. Jedes Gerät kann nun mehrere Tests, die in einen neuen table geschrieben werden, haben. Jeder Test aber nur eine Kundennummer. Ich würde nun gerne in der Übersicht über die Geräte nach der Kundennummer sortieren können.

    PHP-Code:
    'FROM pe_device LEFT JOIN pe_type ON pe_device.pe_type_id = pe_type.id ' .
        
    'LEFT JOIN test_schedule ON test_schedule.pe_device_id = pe_device.id ' .
        
    'LEFT JOIN pe_status ON pe_status.pe_device_id = pe_device.id GROUP BY (pe_device.mac_address) ORDER BY ' .$sort' ' .$sorder.' '
    Also test_schedule.cpe_nr als $sort benutzen. Ich verstehe ja, dass der Eintrag nicht eindeutig ist... gibt es trotzdem eine Möglichkeit ohne über ein extra array oder ähnliches per php zu sortieren?

    Gruß

    Phil


  • #2
    Mir wird das Problem nicht wirklich klar.

    In welcher Tabelle steht die "Kundennummer" und wie heißt die Spalte der "Kundennummer"?

    Code:
      FROM pe_device 
      LEFT JOIN pe_type 
        ON pe_device.pe_type_id = pe_type.id 
      LEFT JOIN test_schedule 
        ON test_schedule.pe_device_id = pe_device.id 
      LEFT JOIN pe_status 
        ON pe_status.pe_device_id = pe_device.id 
       GROUP BY (pe_device.mac_address)
       ORDER BY test_schedule.kunden_id
    Was passiert, wenn Du die entsprechende Spalte in den ORDER BY einsetzt? Eine SQL-Fehlermeldung?

    Grüße
    Thomas

    Kommentar


    • #3
      schonmal vielen Dank für die fixe Hilfe
      also in der tabelle test_schedule werden Tests abgespeichert, die eine Kundennummer haben (test_schedule.cpe_nr) wenn ich jetzt danach sortiere, dann ist 500k <-500 < 200k.. total durcheinandergewürfelt. Ausserdem stehen auch Zeilen deren CPE_NR NULL ist, zwischen den Zahlen. Die Reihenfolge ist zwar immer gleich, aber ich kann das sortier Schema dort nicht erkennen ^^.

      device_id | cpe_nr
      5 | 0
      2 | 2000
      12 | 0
      7 | -500
      4 | 3600

      Nur mal als Beispiel...

      Kommentar


      • #4
        Zitat von xhiBseN Beitrag anzeigen
        device_id | cpe_nr
        5 | 0
        2 | 2000
        12 | 0
        7 | -500
        4 | 3600
        Was ist "device_id", was ist "500k"? Mach doch mal ein konkretes SQL-Beispiel und zeige das Ausgabeergebnis.

        Code:
        FROM pe_device 
          LEFT JOIN pe_type 
            ON pe_device.pe_type_id = pe_type.id 
          LEFT JOIN test_schedule 
            ON test_schedule.pe_device_id = pe_device.id 
          LEFT JOIN pe_status 
            ON pe_status.pe_device_id = pe_device.id 
           GROUP BY (pe_device.mac_address)
           ORDER BY test_schedule.cpe_nr, test_schedule.device_id
        Wie sieht damit die Ausgabe aus?

        Sind die Spalten numerisch oder Varchar/Char mit numerischem Inhalt? Das hat natürlich Einfluß auf die Sortierung.

        Grüße
        Thomas

        Kommentar


        • #5
          Hmm, also die Ausgabe wenn ich es auf der shell abfrage, stimmt :X

          mysql> SELECT pe_device.id AS id, pe_device.inventory_nr AS inventory_nr, pe_type.type_shortcode AS type_shortcode, pe_type.type_description AS type_description, test_schedule.cpe_nr AS cpe_nr, test_schedule.ctt_nr AS ctt_nr, pe_status.status AS status, pe_status.lan_ip_address AS lan_ip_address FROM pe_device LEFT JOIN pe_type ON pe_device.pe_type_id = pe_type.id LEFT JOIN test_schedule ON test_schedule.pe_device_id = pe_device.id LEFT JOIN pe_status ON pe_status.pe_device_id = pe_device.id GROUP BY (pe_device.mac_address) ORDER BY test_schedule.cpe_nr DESC LIMIT 30;
          +-----+--------------+----------------+--------------------------+--------+--------+---------+-----------------+
          | id | inventory_nr | type_shortcode | type_description | cpe_nr | ctt_nr | status | lan_ip_address |
          +-----+--------------+----------------+--------------------------+--------+--------+---------+-----------------+
          | 298 | 1074 | RB411 | MikroTik RouterBOARD 411 | 257612 | 31337 | online | 192.168.178.48 |
          | 263 | 1039 | RB411 | MikroTik RouterBOARD 411 | 111222 | 131337 | offline | 192.168.200.109 |
          | 228 | 1004 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | online | 10.100.4.1 |
          | 244 | 1020 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 192.168.234.235 |
          | 260 | 1036 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 192.168.235.46 |
          | 276 | 1052 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 192.168.234.238 |
          | 292 | 1068 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 192.168.234.121 |
          | 308 | 1084 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | online | 192.168.41.169 |
          | 13 | 13 | WAP54G | Linksys WAP54G | NULL | NULL | offline | 192.168.41.108 |
          | 6 | 6 | DI300 | D-Link DI-300 | NULL | NULL | online | 192.168.0.1 |
          | 229 | 1005 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 192.168.235.4 |
          | 245 | 1021 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 192.168.234.210 |
          | 261 | 1037 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 192.168.235.41 |
          | 277 | 1053 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 172.17.60.29 |
          | 293 | 1069 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 192.168.235.35 |
          | 309 | 1085 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | online | 192.168.39.152 |
          | 16 | 16 | WAP54G | Linksys WAP54G | NULL | NULL | offline | 192.168.33.143 |
          | 20 | 20 | WAP54G | Linksys WAP54G | NULL | NULL | offline | 192.168.56.103 |
          | 230 | 1006 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 192.168.234.246 |
          | 246 | 1022 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 192.168.235.22 |
          | 262 | 1038 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 192.168.235.0 |
          | 278 | 1054 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 172.17.60.36 |
          | 294 | 1070 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | online | 192.168.1.25 |
          | 310 | 1086 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | online | 192.168.34.99 |
          | 15 | 15 | WAP54G | Linksys WAP54G | NULL | NULL | offline | 192.168.40.123 |
          | 23 | 23 | dc49 | DataConnect 49 | NULL | NULL | online | 10.255.1.1 |
          | 231 | 1007 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 192.168.234.221 |
          | 247 | 1023 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 192.168.235.23 |
          | 279 | 1055 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 192.168.234.239 |
          | 295 | 1071 | RB411 | MikroTik RouterBOARD 411 | NULL | NULL | offline | 192.168.235.42 |
          +-----+--------------+----------------+--------------------------+--------+--------+---------+-----------------+
          30 rows in set (0.00 sec)


          In php bekomm ich aber trotzdem Mist raus.. muss wohl auch irgendwas falsch gemacht haben. Ich schau nochmal drüber. Nach dem Versuch jetzt glaube ich, liegt der Fehler eher nicht beim Query

          Danke dir!

          Kommentar


          • #6
            soo, ich hab's jetzt zumindest hinbekommen, dass genau die CPE angezeigt wird, die momentan aktuell ist. Der Fehler in der Sortierung bleibt allerdings, seltsamerweise aber nur bei der php ausgabe, auf der shell funktioniert das alles.. test_schedule.cpe_nr ist INT.

            mysql> SELECT test_schedule.pe_device_id, test_schedule.cpe_nr AS cpe_nr, test_schedule.ctt_nr AS ctt_nr FROM test_schedule WHERE test_schedule.cpe_nr IS NOT NULL;
            +--------------+--------+--------+
            | pe_device_id | cpe_nr | ctt_nr |
            +--------------+--------+--------+
            | 263 | 111222 | 131337 |
            | 298 | 257612 | 31337 |
            | 263 | 111222 | 123123 |
            | 2 | 33333 | 33333 |
            | 2 | -543 | -65543 |
            | 6 | 555555 | 555555 |
            | 263 | 209281 | NULL |
            +--------------+--------+--------+

            Wenn ich es sortiert ausgeben lasse, kommt es genau so, wie ich es gerne auf der Seite ausgegeben hätte..

            Die Ausgabe bei die ich bekomme ist aber folgende, Sortierung nach CPE DESC:

            Kommentar


            • #7
              In Deiner Maske werden erheblich mehr Daten ausgegeben, als bei dem SQL in der Console. Der SQL dortige zeigt drei Spalten, die Maske sieben. Wer oder was erzeugt denn diese Ausgabe. Beim Zusammenmischen wird wohl nochmal im Skript sortiert.

              Grüße
              Thomas

              Kommentar


              • #8
                Ja du hast recht und das ist auch der Fehler, nach dem Join sortiert er nicht so, wie ich es gerne hätte.

                PHP-Code:
                  $sql_str 'SELECT pe_device.id AS id, ' .
                    
                'pe_device.inventory_nr AS inventory_nr, ' .
                    
                'pe_device.mac_address AS mac_address, ' .
                    
                'pe_device.remarks AS remarks, ' .
                    
                'pe_device.tcpcmd_port AS tcpcmd_port, ' .
                    
                'pe_device.telnet_port AS telnet_port, ' .
                    
                'pe_type.type_shortcode AS type_shortcode, ' .
                    
                'pe_type.type_description AS type_description, ' .
                    
                'test_schedule.cpe_nr AS cpe_nr, ' .
                    
                'test_schedule.ctt_nr AS ctt_nr, ' .
                    
                'test_schedule.end_cycle AS end_cycle, ' .
                    
                'pe_status.status AS status, ' .
                    
                'pe_status.last_online AS last_online, ' .
                    
                'pe_status.last_offline AS last_offline, ' .
                    
                'pe_status.last_keepalive AS last_keepalive, ' .
                    
                'pe_status.offline_reason AS offline_reason, ' .
                    
                'pe_status.lan_ip_address AS lan_ip_address, ' .
                    
                'pe_status.fw_revision AS fw_revision ' .
                    
                'FROM pe_device LEFT JOIN pe_type ON pe_device.pe_type_id = pe_type.id ' .
                    
                'LEFT JOIN test_schedule ON test_schedule.pe_device_id = pe_device.id ' .
                    
                'LEFT JOIN pe_status ON pe_status.pe_device_id = pe_device.id GROUP BY pe_device.mac_address ORDER BY test_schedule.cpe_nr ASC '
                Das ist der komplette Query, dieser ist auch in der sql console nicht in der richtigen Reihenfolge. Ich spar mir den langen datenwirrwar, es sieht sowieso so aus, wie auf dem screenshot.

                Ich schätze hier ist einfach was mit dem JOIN nicht richtig. Undzwar bekommt er ja im zweifel mehr als eine CPE (Ich liste alle Geräte die mehrere Tests haben können und jeder Test kann eine eigene Kundennummer, CPE, besitzen. Ich denke hier ist es für SQL nicht eindeutig, nur wie komm ich da drum herum?

                Kommentar


                • #9
                  Der Fehler liegt an dem "falsch" verwendeten "GROUP BY".

                  Code:
                    [...]
                    GROUP BY pe_device.mac_address 
                    ORDER BY test_schedule.cpe_nr ASC
                  Die Datenbank gruppiert nach der spalte "pe_device.mac_address". Innerhalb dieser Gruppe gibt es nun wahrscheinlich mehrere unterschiedliche "test_schedule.cpe_nr " Werte. Die Datenbank liefert hier ein "zufälliges" Ergebnis bei den gruppierten Spalten.

                  Eigentlich sollte bei den gruppierten Spalten ein Aggregat wie MAX(), MIN(), COUNT() etc. verwendet werden. Laut SQL-Standard wäre diese Abfrage auch gar nicht möglich. MySQL erlaubt es mit den entsprechenden Hinweise (siehe RTFM). Die gesamte Abfrage muss korrigert werden, es liegt somit nicht an den JOINs.

                  Du kannst ja testweise den "GROUP BY" weglassen, dann sollte richtig sortiert werden.

                  Grüße
                  Thomas

                  Kommentar


                  • #10
                    Au man, ich hab's hinbekommen Danke für den Tipp. da wäre ich noch laaaange nicht drauf gekommen! Ich wünsche dir einen guten Start in die Woche und noch einmal vielen Dank!!

                    Gruß

                    Philipp

                    Kommentar

                    Lädt...
                    X