zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden [MySQL] Select-Abfrage...

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 22.04.2006, 23:40
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 07.02.2006
Beiträge: 78
Hairy befindet sich auf einem aufstrebenden Ast
Standard [MySQL] Select-Abfrage...

Guten Tag.

Ich habe eine MySQL-Tabelle, die ungefähr so aussieht (nach Datum geordnet):

_spalte1_|_spalte2_|_spalte3_|_spalte4_
___3____|___0____|__wert__|_datum_
___3____|___0____|__wert__|_datum_
___3____|___2____|__wert__|_datum_
___2____|___0____|__wert__|_datum_
___6____|___0____|__wert__|_datum_
___3____|___2____|__wert__|_datum_
___3____|___2____|__wert__|_datum_
___6____|___1____|__wert__|_datum_
___6____|___1____|__wert__|_datum_
___2____|___0____|__wert__|_datum_
___6____|___1____|__wert__|_datum_
___2____|___0____|__wert__|_datum_
___3____|___2____|__wert__|_datum_
___2____|___0____|__wert__|_datum_

=> spalte 1 enthält beliebige Zahlen, zu jeweils der gleichen Zahl ist in Spalte 2 zuerst 0, später dann meist irgendeine Zahl != 0 gespeichert. Wert ist jedesmal etwas anderes.

Nun hätte ich gerne eine Select-Abfrage, die mir folgendes ausgibt:

_spalte1_|_spalte2_|_spalte3_|_spalte4_
___3____|___2____|__wert__|_datum_
___2____|___0____|__wert__|_datum_
___6____|___1____|__wert__|_datum_

- und nicht mehr.
Also jeweils nur den "neuesten" Eintrag, den es zu einer Zahl in Spalte 1 gibt.
Hat jemand eine Idee?
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 23.04.2006, 00:15
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 20.02.2005
Beiträge: 1.045
Tigereye befindet sich auf einem aufstrebenden Ast
Standard

Mir würde da spontan sowas in den Sinn kommen:
Code:
SELECT * FROM table WHERE spalte1 = '6' ORDER BY spalte4 DESC LIMIT 1
für die anderen Zahlen analog. Sind halt dann drei Queries, kA, ob man das irgendwie optimieren könnte.
btw: Ich weiß nicht sicher, ob das "ORDER BY spalte4 DESC" nötig ist, wenn die Tabelle sowieso schon nach dem Datum sortiert ist. Außerdem würde das "ORDER BY..." fast nur bei Timestamps funktionieren.
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 23.04.2006, 00:20
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 07.02.2006
Beiträge: 78
Hairy befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Tigereye
Mir würde da spontan sowas in den Sinn kommen:
Code:
SELECT * FROM table WHERE spalte1 = '6' ORDER BY spalte4 DESC LIMIT 1
für die anderen Zahlen analog. Sind halt dann drei Queries, kA, ob man das irgendwie optimieren könnte.
btw: Ich weiß nicht sicher, ob das "ORDER BY spalte4 DESC" nötig ist, wenn die Tabelle sowieso schon nach dem Datum sortiert ist. Außerdem würde das "ORDER BY..." fast nur bei Timestamps funktionieren.
Naja also mit
Code:
SELECT DISTINCT spalte1 FROM  table ORDER BY spalte4 DESC
bekomme ich den Wert in spalte1 jeweils nur einmal ausgegeben... denn das müssen ja nicht nur drei sein, das können beliebig viele unterschiedliche sein.
Kann man mySQL-Abfragen nicht irgendwie verschachteln?
Mit Zitat antworten
  #4 (permalink)  
Alt 23.04.2006, 02:07
Jan Jan ist offline
Erfahrener Benutzer
XHTMLforum-Mitglied
 
Registriert seit: 27.02.2005
Beiträge: 172
Jan befindet sich auf einem aufstrebenden Ast
Standard

Hi!

Mit dieser Abfrage würde ich alle möglichen Datensätze aus dem Feld "spalte1" auslesen.

Code:
SELECT spalte1
FROM table
GROUP BY spalte1
Das Ergebnis kannst du dann dazu nutzen, den jeweils aktuellsten Datensatz zu bekommen.

Generell würde ich in solch einem Fall zu einer zweiten Tabelle greifen, die für jede Kobination aus "spalte1" den aktuellsten Datensatz speichert.

Mit einer Abfrage bekommt man diese Lösung glaube ich nicht hin. HAVING hilft meiner Meinung nach auch nicht viel weiter. Oder hat jemand noch eine andere Idee?

Gruß
Jan
Mit Zitat antworten
  #5 (permalink)  
Alt 23.04.2006, 10:46
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 07.02.2006
Beiträge: 78
Hairy befindet sich auf einem aufstrebenden Ast
Standard

Also ich hab jetzt auch nochmal selbst experimentiert.
Mit
Code:
SELECT * FROM table WHERE spalte1 = "3" ORDER BY spalte4 DESC LIMIT 1
bekomme ich den jeweils neuesten Wert, bei dem spalte1 3 ist:
_spalte1_|_spalte2_|_spalte3_|_spalte4_
___3____|___2____|__wert__|_datum_

Dies müsste man nun mit allen vorhandenen Werten für spalte1 genau einmal machen.
Diese bekomme ich mit
Code:
SELECT DISTINCT spalte1 
FROM table
_spalte1_|
___3____|
___2____|
___6____|

Natürlich könnte ich jetzt den "Umweg" über PHP nehmen, also zuerst mit SELECT DISTINCT alle Werte für spalte1 in ein Array laden, und dann für jeden davon eine neue MySQL-Abfrage durchführen - aber ich denke das geht doch sicher auch direkt mit MySQL?

Eigentlich müsste es ja mit WHERE spalte1 IN (SELECT DISTINCT spalte1
FROM table) gehen... also
Code:
SELECT * FROM table WHERE spalte1 IN (SELECT DISTINCT spalte1 
FROM table) ORDER BY spalte4 DESC LIMIT 1
... nur meint SQL dazu:
Zitat:
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT DISTINCT spalte1 …
Wo liegt der (Denk-?)Fehler?
Mit Zitat antworten
  #6 (permalink)  
Alt 23.04.2006, 13:46
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 07.02.2006
Beiträge: 78
Hairy befindet sich auf einem aufstrebenden Ast
Standard

Ich habe es nun mit dem Umweg über PHP und 3 MySQL-Abfragen geschafft:

Code:
$sql = 'SELECT DISTINCT spalte1 FROM table ';
$result= mysql_query($sql) or die(mysql_error());
$spalte1_werte = array();
while ($row = mysql_fetch_assoc($result)) {
	$spalte1_werte[] = $row['spalte1'];
}
foreach ($spalte1_werte as $spalte1_wert) {
$spalte1_werte_str = $spalte1_werte_str.',"'.$spalte1_wert.'"';
}
$sql = 'SELECT spalte1 , MAX( spalte4) AS spalte4 FROM table WHERE spalte1 '
        . ' IN ( '.trim($spalte1_werte_str, ',').' )'
        . ' GROUP BY spalte1 ORDER BY spalte4 DESC';
$result= mysql_query($sql) or die(mysql_error());
while ($row = mysql_fetch_assoc($result)) {
	$spalte4_werte[] = $row['spalte4'];
}
foreach ($spalte4_werte as $spalte4_wert) {
$spalte4_werte_str = $spalte4_werte_str.',"'.$spalte4_wert.'"';
}
$sql = 'SELECT * '
        . ' FROM table'
        . ' WHERE spalte1 '
        . ' IN ( '.trim($spalte1_werte_str, ',').' ) AND spalte4 '
        . ' IN ( '.trim($spalte4_wertes_str, ',').' )'
        . ' GROUP BY spalte1 '
        . ' ORDER BY spalte4 DESC';
$result= mysql_query($sql) or die(mysql_error());
...das scheint tatsächlich soweit zu funktionieren, aber das ganze in einer Abfrage wäre mir lieber gewesen...
Mit Zitat antworten
  #7 (permalink)  
Alt 23.04.2006, 16:43
Benutzer
neuer user
 
Registriert seit: 13.02.2005
Beiträge: 39
nodh befindet sich auf einem aufstrebenden Ast
Standard

Das sollte es tun:
Code:
SELECT DISTINCT t.spalte1, t.spalte2, t.spalte3, t.spalte4
FROM `table` t
WHERE t.spalte4 = (SELECT MAX(t1.spalte4)
                   FROM `table` t1
                   WHERE t1.spalte1 = t.spalte1)
__________________
mfg, nodh. – Weblog
Mit Zitat antworten
  #8 (permalink)  
Alt 23.04.2006, 16:51
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 07.02.2006
Beiträge: 78
Hairy befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nodh
Das sollte es tun:
Code:
SELECT DISTINCT t.spalte1, t.spalte2, t.spalte3, t.spalte4
FROM `table` t
WHERE t.spalte4 = (SELECT MAX(t1.spalte4)
                   FROM `table` t1
                   WHERE t1.spalte1 = t.spalte1)
Leider unterstützt die mySQL-Version des Servers noch keine Subquerys
Trotzdem danke.
Mit Zitat antworten
  #9 (permalink)  
Alt 23.04.2006, 21:18
Benutzerbild von derHund
durstiges Tier
XHTMLforum-Mitglied
 
Registriert seit: 16.09.2004
Beiträge: 869
derHund befindet sich auf einem aufstrebenden Ast
Standard

ich habe - muß ich gestehen - deine ausführungen nur überflogen, vermute aber einfach mal, daß dir das hilft. in den user comments, der von Csaba Gabor on March 16 2003 9:44am
__________________
Die Zeit hat ihre Kinder längst gefressen: hund (back in black) | ??? | ??? | ...
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 23.04.2006, 21:52
Benutzer
neuer user
 
Registriert seit: 13.02.2005
Beiträge: 39
nodh befindet sich auf einem aufstrebenden Ast
Standard

Ja, stimmt, das funktioniert:
Code:
SELECT t1.*
FROM `table` AS t1 LEFT JOIN `table` AS t2
ON t1.spalte1=t2.spalte1 AND t1.spalte4<t2.spalte4
WHERE t2.spalte1 IS NULL
__________________
mfg, nodh. – Weblog
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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 aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Template in einer Abfrage Benutzername Serveradministration und serverseitige Scripte 4 20.10.2010 16:03
SQL Abfrage, Logfile auswerten Scheppertreiber Offtopic 0 22.02.2010 10:11
select abfragen, wenn kein onchange statt findet Cyro Javascript & Ajax 6 10.02.2008 21:28
Mysql: mit nur einem Select das nächste Element auswählen (nicht kontinuierliche Tab) braindead Serveradministration und serverseitige Scripte 1 20.01.2008 14:14
[mySQL]: Suche Hilfe für komplexere Abfrage trequ Serveradministration und serverseitige Scripte 1 07.06.2007 13:17


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