php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 26.03.2010, 10:52  
Neuer Benutzer
 
Registriert seit: 26.03.2010
Beiträge: 6
PHP-Kenntnisse:
Anfänger
xhiBseN befindet sich auf einem aufstrebenden Ast
Standard 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
xhiBseN ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 26.03.2010, 11:16  
thomas_w
Gast
 
Beiträge: n/a
Standard

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
  Mit Zitat antworten
Alt 26.03.2010, 13:05  
Neuer Benutzer
 
Registriert seit: 26.03.2010
Beiträge: 6
PHP-Kenntnisse:
Anfänger
xhiBseN befindet sich auf einem aufstrebenden Ast
Standard

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...

Geändert von xhiBseN (26.03.2010 um 13:13 Uhr).
xhiBseN ist offline   Mit Zitat antworten
Alt 26.03.2010, 13:23  
thomas_w
Gast
 
Beiträge: n/a
Standard

Zitat:
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
  Mit Zitat antworten
Alt 26.03.2010, 13:49  
Neuer Benutzer
 
Registriert seit: 26.03.2010
Beiträge: 6
PHP-Kenntnisse:
Anfänger
xhiBseN befindet sich auf einem aufstrebenden Ast
Standard

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!
xhiBseN ist offline   Mit Zitat antworten
Alt 26.03.2010, 15:27  
Neuer Benutzer
 
Registriert seit: 26.03.2010
Beiträge: 6
PHP-Kenntnisse:
Anfänger
xhiBseN befindet sich auf einem aufstrebenden Ast
Standard

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:


Geändert von xhiBseN (26.03.2010 um 16:17 Uhr).
xhiBseN ist offline   Mit Zitat antworten
Alt 26.03.2010, 19:33  
thomas_w
Gast
 
Beiträge: n/a
Standard

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
  Mit Zitat antworten
Alt 29.03.2010, 09:50  
Neuer Benutzer
 
Registriert seit: 26.03.2010
Beiträge: 6
PHP-Kenntnisse:
Anfänger
xhiBseN befindet sich auf einem aufstrebenden Ast
Standard

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?

Geändert von xhiBseN (29.03.2010 um 09:54 Uhr).
xhiBseN ist offline   Mit Zitat antworten
Alt 29.03.2010, 10:26  
thomas_w
Gast
 
Beiträge: n/a
Standard

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
  Mit Zitat antworten
Alt 29.03.2010, 10:52  
Neuer Benutzer
 
Registriert seit: 26.03.2010
Beiträge: 6
PHP-Kenntnisse:
Anfänger
xhiBseN befindet sich auf einem aufstrebenden Ast
Standard

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
xhiBseN ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Sortieren (ORDER BY) nach INNER JOIN asyoulikeit Datenbanken 10 21.04.2009 15:01
Persistence Framework #Avedo Software-Design 37 28.03.2009 17:32
Bräuchte hilfe bei schleifenproblem innerhalb SQL anweisung Kronic73 Datenbanken 8 01.03.2009 01:10
[Erledigt] mit einer CHECKBOX feld nach mehreren wörtern durchsuchen taurus Datenbanken 20 01.12.2008 10:49
[Erledigt] Left join und inner join stefanjann Datenbanken 7 16.10.2008 15:45
dynamische Tabelle sortieren Supeede PHP-Fortgeschrittene 11 29.01.2008 08:48
tabelle sortieren mit php? Thuata PHP Tipps 2008 6 26.09.2007 13:46
Problem mit Inner join Jabi Datenbanken 15 09.05.2006 14:10
[Problem selbst gelöst] Sortieren über 2 Tabellen Alpha Centauri Datenbanken 1 04.04.2006 16:37
ausgegebene Tabelle über Links sortieren? PHP Tipps 2005 6 31.05.2005 12:39
Sortieren einer Tabelle woods Datenbanken 4 02.12.2004 20:02
Group by sortieren ? Datenbanken 26 14.09.2004 20:28
Tabelle auslesen und sortieren lassen PHP Tipps 2004 4 02.09.2004 11:24
2 Werte aus 1 Tabelle mit JOIN? Datenbanken 5 19.08.2004 10:53
Sortieren einer Tabelle mit den Werten aus einer anderen Tab Datenbanken 5 04.08.2004 18:09

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
join sortieren, php ausgabe join, http://www.php.de/datenbanken/66190-tabelle-nach-join-sortieren.html, left join sortierung, left join sortieren, nach join sortieren, join tabelle sortieren, php sortierung left join, mysql sortieren join, mysql join sortieren, group by nach join, t-sql left join group by einer spalte, sortierung über join, ergebnis nach left join anordnen, tabelle sortieren join, sortierte ausgabe 2 tabellen join, mysql nach kundennummer gruppieren, sql join sortieren nach id, sort left join mysql, sortieren nach inner join

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:06 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum