php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 21.06.2011, 18:39  
Neuer Benutzer
 
Registriert seit: 27.08.2008
Beiträge: 13
PHP-Kenntnisse:
Fortgeschritten
mcules befindet sich auf einem aufstrebenden Ast
Standard Group über zwei Felder und Sortierung

Hallo,

heute habe ich mal wieder ein kleines Problemchen...

Ich habe eine Tabelle mit folgendem Aufbau:
Code:
CREATE TABLE `Positionen` (
  `Id` int(11) NOT NULL auto_increment,
  `GpsProviderId` int(11) NOT NULL,
  `Mobilnummer` varchar(25) collate utf8_unicode_ci NOT NULL,
  `NaviId` varchar(10) collate utf8_unicode_ci NOT NULL,
  `Timestamp` timestamp NULL default '0000-00-00 00:00:00',
  `Longitude` decimal(10,6) NOT NULL,
  `Latitude` decimal(10,6) NOT NULL,
  `Hoehe` decimal(10,1) NOT NULL,
  `Geschwindigkeit` decimal(10,1) NOT NULL,
  `Richtung` int(11) NOT NULL default '0',
  `Sateliten` int(11) NOT NULL default '0',
  PRIMARY KEY  (`Id`),
  KEY `NaviId` (`NaviId`),
  KEY `Mobilnummer` (`Mobilnummer`)
) ENGINE=InnoDB;
In dieser Tabelle liegen Positionsdaten von verschiedenen Navis.
Ein Navi wird entweder über die Mobilnummer oder über die NaviId referenziert.
D.h. entweder ist die Mobilnummer gesetzt ODER die NaviId.

Nun möchte ich möglichst Ressourcen schonend die jeweils aktuellsten Daten aller Navis abfragen.

Versucht habe ich es über:
Code:
SELECT Positionen.*
FROM Positionen
WHERE Timestamp=(
    SELECT MAX(Posits.Timestamp)
    FROM Positionen as Posits
    WHERE Positionen.NaviId=Posits.NaviId OR Positionen.Mobilnummer=Posits.Mobilnummer
)
Aber da liefert er mir nicht alle Geräte.
Kann mir vielleicht mal jemand einen Stupser in die richtige Richtung geben?

Geändert von mcules (21.06.2011 um 18:53 Uhr). Grund: Formatierung
mcules ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 21.06.2011, 19:04  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.723
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Mein erster Gedanke wäre, die Fälle „ID gesetzt“ und „Nummer gesetzt“ einzeln abzuarbeiten und mit UNION zu verbinden.

Innerhalb der beiden zu vereinigenden Queries würde ich dann mit einem within-group aggregate versuchen, die jeweils aktuellste Zeile eines Eintrags zu erhalten.

http://www.artfulsoftware.com/infotree/queries.php#101

Bei Verzicht auf UNION ließe sich vielleicht mit einer IF-Funktion was basteln.
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 21.06.2011, 19:25  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.266
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Kannst du das Schema ändern? Du schleppst die Problematik, welcher Wert nun gesetzt ist, sonst durch das gesamte System. Ich würde einen internen Schlüssel verwenden oder beide kombinieren, durch (ggf. beidseitigen) Zerofill.

navi
id (PK AI) | navi_unqiue (UN, char)
1 | 827465287452 00000000000000
2 | 000000000000 00000000089483
(evtl. musst du ihn nicht mal kombinieren, sondern kannst beide Spalten gemeinsam auf UNIQUE setzen; vorher aber nochmal NULL-Problematik gegenprüfen, also ob NULL in einer kombinierten UNIQUE-Spalte Probleme bereitet)

position
id (PK AI) | ..
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 21.06.2011, 19:40  
Neuer Benutzer
 
Registriert seit: 27.08.2008
Beiträge: 13
PHP-Kenntnisse:
Fortgeschritten
mcules befindet sich auf einem aufstrebenden Ast
Standard

Habs jetzt anders "vereinfacht". Habe das Feld NaviId gestrichen da die Navis die eine ID besitzen ebenfalls eine Mobilnummer haben.
Die lasse ich jetzt mit eintragen.
Nun muß ich nur noch ein Feld gruppieren und dort die jeweils aktuellsten Werte ausgeben lassen.

Code:
SELECT *
FROM (
    SELECT *
    FROM Positionen
    ORDER BY Timestamp DESC
) as s
GROUP BY Mobilnummer
So gibt er es richtig aus.
Habt ihr vielleicht noch was was weniger Datenbanklastig ist? Für jedes Navi wird alle fünf Sekunden ein neuer Wert eingetragen, entsprechend groß ist natürlich auch die Tabelle

Geändert von mcules (21.06.2011 um 19:44 Uhr). Grund: Lösung
mcules ist offline   Mit Zitat antworten
Alt 21.06.2011, 19:59  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.723
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Ich weiß es nicht sicher, aber ich würde nicht unbedingt drauf wetten, dass deine Query definiert den neuesten Timestamp pro Gruppe zurückliefert. Siehe mein Link für Alternativen.

Was Optimierungen angeht: Eine Option wäre es, eine Extratabelle anzulegen, die nur den aktuellsten Eintrag (oder einen Fremdschlüssel darauf) pro Gerät hält. Aber ob das schlau ist, kann ich nicht wirklich beurteilen.
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 21.06.2011, 20:48  
Neuer Benutzer
 
Registriert seit: 27.08.2008
Beiträge: 13
PHP-Kenntnisse:
Fortgeschritten
mcules befindet sich auf einem aufstrebenden Ast
Standard

Doch, gibt den neusten aus, die Tabelle ist ja bereits mit Werten gefüllt
mcules ist offline   Mit Zitat antworten
Alt 21.06.2011, 21:24  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.723
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Sehe gerade, dass die Lösung sogar auf der Seite aufgeführt wird, die ich verlinkt habe (im selben Abschnitt ziemlich gegen Ende). Hm…

In der MySQL-Doku heißt es:

Zitat:
The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate.
- http://dev.mysql.com/doc/refman/5.1/...n-columns.html

*schulterzuck*
__________________
Blog | Buch | Kaloa
mermshaus 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
SQL Sortierung und GROUP BY draco88 Datenbanken 8 26.11.2010 07:53
[Erledigt] Summation über Unterabfragen - Mysql jume Datenbanken 20 30.05.2010 09:58
AD zugriff über PHP jared566 PHP Tipps 2010 6 12.05.2010 11:32
[Erledigt] MySQL count(distinct) über mehrere Spalten mit GROUP BY Problem DJwebdesign Datenbanken 6 06.03.2010 16:05
Group by über 10 spalten t10 Datenbanken 6 18.01.2010 18:55
ORDER BY vor GROUP BY Problem kn0wledge Datenbanken 9 04.09.2009 00:18
Projekt: User über Intranetpage erstellen, auf einen VoIP-Server beta1234 PHP Tipps 2009 2 22.07.2009 13:21
[Erledigt] Einzelnen DB-Eintrag über ID anzeigen Knutschi PHP Tipps 2009 6 26.03.2009 09:56
sortierung einer Abfrage über 2 Tabellen mchacka Datenbanken 2 17.03.2009 17:55
Suche über mehrere Felder mit Sortierung nach Relevanz Dongle Datenbanken 6 17.12.2008 10:34
Sortierung der Ausgabe über URL red-head Datenbanken 5 09.12.2008 15:52
[Erledigt] Problem mit dem Füllen einer Tabelle über Formular PHP Tipps 2006 18 10.01.2006 12:51
Grafik über mehrere Zellen einer Tabelle neodrei HTML, Usability und Barrierefreiheit 9 18.08.2005 19:26
Umleitung über Meta-Angaben im Header abhängig vom Host PHP Tipps 2004 7 14.06.2004 12:34

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
group by zwei felder, group über zwei spalten

Alle Zeitangaben in WEZ +2. Es ist jetzt 12:24 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