Vorherige Zeilen mit Wert aus nachfolgender füllen

trbo2602

Benutzer
Beiträge
10
Hallo Forum,

ich entwerfe zurzeit eine Datenbank und stehe vor folgendem Problem, hier mal ein auszug aus der Datenbank :

tabelle.PNG

Nun möchte ich es gerne schaffen, dass der Wert für 'bon' in sämtlichen Zeilen oberhalb auftritt.
Die Tabelle geht in dem Format weiter, wobei hinter der Zeile mit der '254908' wieder x Zeilen mit einer 0 folgen, bis dann wieder eine mit einem Wert für Bon erscheint.

Ich möchte nun gerne, das die Nummer immer in die vorhergehenden Zeilen eingefügt wird, so lange bis ein anderer Wert für Bon erscheint. (quasi also nur die vorherigen Zeilen mit dem Wert für bon füllen)


Code:
SELECT * FROM `tabelle` WHERE bon LIKE '%%%%%%'  UPDATE `bon` WHERE bon='0' AND 'uhrzeit'  .....

hier hapert es dann, da meine Tabelle nach Uhrzeit sortiert ist dachte ich mir es bietet sich hier vielleicht an den Wert von bon einfach zu allen Uhrzeiten davor einzufügen, wobei bon in der Zeile den Wert 0 hat.

Ich hoffe mir kann jemand helfen.

Mfg

trbo
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
Sorry habe noch nicht so die Erfahrung. Also ich will für das Beispielbild oben jetzt den Wert 254908 in alle Zeilen wo bei bon eine 0 ist einfügen.

lg
trbo
 
Ich bin schon etwas durch aber so in etwa könnte ein Select aussehen:
Code:
SELECT   t1.ean,
     t1.snr,
     t1.uhrzeit,
     t1.bon,
     (   SELECT   t2.bon
       FROM   tabelle t2
       WHERE   t2.uhrzeit > t1.uhrzeit
       AND     t2.bon <> 0
       AND NOT EXISTS (   SELECT   1
                 FROM   tabelle t3
                 WHERE   t3.uhrzeit < t2.uhrzeit
                 AND     t3.uhrzeit > t1.uhrzeit
                 AND     t3.bon <> 0 ) ) AS bon_neu
FROM   tabelle t1
Jetzt kann MySQL beim Update natürlich nicht im Subselect auf die selbe Tabelle zugreifen, daher muss man da wohl tricksen. Aber würde das Ergebnis denn so passen?
 
Ich bin schon etwas durch aber so in etwa könnte ein Select aussehen:
Code:
SELECT   t1.ean,
     t1.snr,
     t1.uhrzeit,
     t1.bon,
     (   SELECT   t2.bon
       FROM   tabelle t2
       WHERE   t2.uhrzeit > t1.uhrzeit
       AND     t2.bon <> 0
       AND NOT EXISTS (   SELECT   1
                 FROM   tabelle t3
                 WHERE   t3.uhrzeit < t2.uhrzeit
                 AND     t3.uhrzeit > t1.uhrzeit
                 AND     t3.bon <> 0 ) ) AS bon_neu
FROM   tabelle t1
Jetzt kann MySQL beim Update natürlich nicht im Subselect auf die selbe Tabelle zugreifen, daher muss man da wohl tricksen. Aber würde das Ergebnis denn so passen?

ich habe es jetzt ma mit dem code probier aber da wird mir garkein ergebnis geliefert. bekomme die syntax nicht passend hin was hat es mit dem t1, t2 & t3 auf sich die habe ich ja nirgendwo definiert glaube das liegt das Problem das ich bei mir kein ergebnis raus bekomme

lg
 
Ja ich mache insgesamt 3 Selects auf die selbe Tabelle daher brauche ich Aliase. Ich vergleiche in den Subselects Werte mit Werten aus den anderen Selects.
 
SELECT `uhrzeit`, `bon` FROM `testges` WHERE `bon`!= 0

hiermit bekomme ich alles ausgegeben wo ein wert für bon existiert

kann ich von hier aus nicht z.B. mit einer art schleife weiter arbeiten, wobei ich bon und uhrzeit einer variablen zuweisen und die dann so lange eingefügt wird bis die uhrzeit nicht mehr kleiner ist ?

''sinngemäß'' so in etwa:

SET `uhrzeit`=x, `bon`=y
UPDATE `bon`= y WHERE `uhrzeit`< x
 
So ginge es z.B. in Oracle...
Code:
Update deine_tabelle t
Set    t.bon =
       (Select Max(p.bon) keep(dense_rank First Order By p.uhrzeit Asc)
        From   deine_tabelle p
        Where  p.uhrzeit > t.uhrzeit
        And    p.bon <> 0)
Where  t.bon = 0

Allerdings kann MySQL nicht von der Tabelle selektieren, die gerade geupdatet wird...
 
2.jpg

-> vllt nochmal als anhang das ist was eigentlich passieren soll


@Distrilec : danke ich werde mal versuchen ob ich das so anpassen kann und gebe dann mal rückmeldung ob es klappt
 
Es gibt warscheinlich 20 Wege das mit einem direkten UPDATE zu formulieren aber MySQL ist hier mit seiner Einschränkung sehr hinderlich. Natürlich kann man eine Schleife oder einen Cursor benutzen, ist aber nicht so elegant.
 
ach bei meinem Erfahrungsstand mache ich mir nicht so die sorgen um elegant oder nicht haha. sollte hauptsache funktionieren, bin aber grade noch am rumprobieren klappt noch nicht so ganz
 
Ich bin schon etwas durch aber so in etwa könnte ein Select aussehen:
Code:
SELECT   t1.ean,
............
FROM   tabelle t1
Jetzt kann MySQL beim Update natürlich nicht im Subselect auf die selbe Tabelle zugreifen, daher muss man da wohl tricksen. Aber würde das Ergebnis denn so passen?


So gehts aber :)

Code:
mysql> select * from ids;
+----+------+
| id | val  |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
|  4 |    4 |
|  5 |    5 |
+----+------+
5 rows in set (0,00 sec)

mysql> UPDATE ids i SET val =
  ->  (SELECT val FROM
  ->  (SELECT id,val FROM ids ) tmp
  ->  WHERE tmp.id < i.id ORDER BY id DESC LIMIT 1 );
Query OK, 5 rows affected, 2 warnings (0,00 sec)

mysql> select * from ids;
+----+------+
| id | val  |
+----+------+
|  1 | NULL |
|  2 |    1 |
|  3 |    2 |
|  4 |    3 |
|  5 |    4 |
+----+------+
5 rows in set (0,00 sec)

mysql>

Gruss

Bernd
 
Werbung:
@Bernd : ich habe es so probiert aber da scheint für meinen Fall nicht funktionieren, wenn ich es so mache passiert komischerweise nichts
 
Zurück
Oben