select .... hilfe

Alles, was MySQL betrifft, kann hier besprochen werden.

select .... hilfe

Postby tina23 » 20. February 2009 18:00

Hallo erstmal.

Ich suche nach dem letzten Status 0 Wert einer UID und
dem dazugehörigen (selbe UID) Status 1 Wert vor dem letzten Status 0 Wert.



Das ist meine Tabelle:

mysql> select * from dznw;
+----+------+-----------------------+--------+
| id | uid | datum | status |
+----+------+-----------------------+--------+
| 1 | 1000 | 2009-01-24 08:01:01 | 1 | (1..... arbeitsbeginn)
| 2 | 1000 | 2009-01-24 10:12:15 | 0 | (0..... arbeitsende)
| 3 | 1000 | 2009-01-24 10:17:23 | 1 |
| 4 | 1000 | 2009-01-24 12:06:46 | 0 |
| 5 | 2222 | 2009-01-24 12:30:14 | 1 |
| 6 | 2222 | 2009-01-24 14:03:06 | 0 |
| 7 | 2222 | 2009-01-24 14:27:27 | 1 |
| 8 | 1000 | 2009-01-24 15:04:23 | 1 |
| 9 | 2222 | 2009-01-25 08:46:18 | 0 |
| 10 | 1000 | 2009-01-25 08:47:39 | 0 |
| 11 | 1000 | 2009-01-25 12:00:00 | 1 |
+----+------+---------------------+--------+
11 rows in set (0.00 sec)

Jetzt benutze ich folgende Abfrage:


mysql> SELECT `id`, UNIX_TIMESTAMP(`datum`) AS `timestamp` FROM `dznw` WHERE `status` = '0' ORDER BY `id` DESC LIMIT 1;
+----+------------+
| id | timestamp |
+----+------------+
| 10 | 1232869659 |
+----+------------+
1 row in set (0.01 sec)

Somit bekomme ich genau den Wert den ich suche.



Jetzt zu meinem PROBLEM:
Aber wenn ich jetzt nach dem letzten Status 1 Wert „vor“ dem letzten Status 0 Wert suche weiß ich nicht wie das funktionieren soll.
Diese Abfrage funktioniert nur wenn der letzte Status Wert eine 0 enthält,


mysql> SELECT `id`, UNIX_TIMESTAMP(`datum`) AS `timestamp` FROM `dznw` WHERE `status` = '1' AND `id` < 35 ORDER BY `id` DESC LIMIT 1;
+----+------------+
| id | timestamp |
+----+------------+
| 11 | 1232881200 |
+----+------------+
1 row in set (0.00 sec)

Was mach ich falsch
tina23
 
Posts: 1
Joined: 20. February 2009 17:59

Re: select .... hilfe

Postby Nobbie » 20. February 2009 19:02

>Was mach ich falsch

Ziemlich viel.

Der grundsätzliche Kardinalfehler liegt darin, dass Du die Sortierung nach UID durchführst, aber benötigt wird die Sortierung nach Datum. Du willst ja nicht die höchste UID, sondern den Satz mit dem neuesten Datum haben.

Und im zweiten Select ist die Bedingung "id < 35" völlig falsch, denn diese Bedingung kannst Du auch weglassen, weil die immer wahr ist (alle id wie 1, 2 3, usw, sind kleiner als 35). Stattdessen mußt Du "uid = xxx" abfragen, wobei xxx der Wert der uid aus der Abfrage davor ist. Und auch hier mußt Du nach Datum sortieren (nicht nach uid) und mußt den Datensatz finden, dessen Datum kleiner ist als das Datum aus dem ersten Select, aber das größtmögliche Datum, der bei Status den Wert 1 hat und die uid den Wert 11 hat (in diesem Fall).

So, das mußt Du jetzt einfach umsetzen. Ist nicht so sehr schwer, mache genau das, was ich geschrieben habe.
Nobbie
 
Posts: 7147
Joined: 09. March 2008 13:04


Return to MySQL

Who is online

Users browsing this forum: No registered users and 2 guests