|
|||
[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? |
Sponsored Links |
|
|||
Mir würde da spontan sowas in den Sinn kommen:
Code:
SELECT * FROM table WHERE spalte1 = '6' ORDER BY spalte4 DESC LIMIT 1 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. |
Sponsored Links |
|
|||
Zitat:
Code:
SELECT DISTINCT spalte1 FROM table ORDER BY spalte4 DESC Kann man mySQL-Abfragen nicht irgendwie verschachteln? |
|
|||
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 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 |
|
|||
Also ich hab jetzt auch nochmal selbst experimentiert.
Mit Code:
SELECT * FROM table WHERE spalte1 = "3" ORDER BY spalte4 DESC LIMIT 1 _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 ___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 Zitat:
|
|
|||
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 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 |
|
|||
Zitat:
Trotzdem danke. |
|
||||
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) | ??? | ??? | ... |
Sponsored Links |
|
|||
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 |
Sponsored Links |
Themen-Optionen | |
Ansicht | |
|
|
Ä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 |