Eine Random Reihe anzeigen und Wert ändern

joko15

Benutzer
Beiträge
5
Hallo zusammen,

Habe mal ne Frage unzwar wie kann ich eine Reihe zufällig auswählen und darin dann den Wert ändern. Diese Reihe mit dem veränderten Wert sollte dann auch angezeigt werden.
Bei meeinem Versuch wird die veränderte Reihe leider nicht ausgegeben, weiß leider nicht wie das dann geht:

UPDATE table
SET `value`= `value`+1
WHERE Id = (SELECT *
FROM ( SELECT Id
FROM table
ORDER BY RAND()
LIMIT 1 ) dt1
);

Vielen Dank
 
Werbung:
Hallo zusammen,

Habe mal ne Frage unzwar wie kann ich eine Reihe zufällig auswählen und darin dann den Wert ändern. Diese Reihe mit dem veränderten Wert sollte dann auch angezeigt werden.
Bei meeinem Versuch wird die veränderte Reihe leider nicht ausgegeben, weiß leider nicht wie das dann geht:

UPDATE table
SET `value`= `value`+1
WHERE Id = (SELECT *
FROM ( SELECT Id
FROM table
ORDER BY RAND()
LIMIT 1 ) dt1
);

Vielen Dank


Code:
test=# create table rrr as select s::int as id, null::int as val from generate_series(1,10) s;
SELECT 10
test=*# select * from rrr;
 id | val
----+-----
  1 |
  2 |
  3 |
  4 |
  5 |
  6 |
  7 |
  8 |
  9 |
 10 |
(10 rows)

test=*# update rrr set val=random()*100::int where id = (select id from rrr order by random() limit 1);
UPDATE 1
test=*# select * from rrr;
 id | val
----+-----
  1 |
  2 |
  3 |
  4 |
  6 |
  7 |
  8 |
  9 |
 10 |
  5 |  91
(10 rows)

test=*# update rrr set val=random()*100::int where id = (select id from rrr order by random() limit 1);
UPDATE 1
test=*# select * from rrr;
 id | val
----+-----
  1 |
  2 |
  4 |
  6 |
  7 |
  8 |
  9 |
 10 |
  5 |  91
  3 |  89
(10 rows)

test=*#

Was meinst Du mit 'wird nicht ausgegeben'? Ein Update gibt nichts aus, nur ein Select. Wenn Du nur die geänderte Zeile sehen willst geht aber sowas hier:

Code:
test=*# with rrr_new as (update rrr set val=random()*100::int where id = (select id from rrr order by random() limit 1) returning *) select * from rrr_new;;
 id | val
----+-----
  1 |  43
(1 row)

test=*# with rrr_new as (update rrr set val=random()*100::int where id = (select id from rrr order by random() limit 1) returning *) select * from rrr_new;;
 id | val
----+-----
 10 |  41
(1 row)

test=*# with rrr_new as (update rrr set val=random()*100::int where id = (select id from rrr order by random() limit 1) returning *) select * from rrr_new;;
 id | val
----+-----
  8 |  51
(1 row)

Das geht zumindest in PostgreSQL, vermutlich aber nicht in MySQL.
 
ja genau benötige es in MySql eben mit einem Select statement, aber die frage ist nur wie?

Ich glaube, das wird in MySQL mit derzeitigen Versionen generell so nicht gegeh, Wie sehr viele andere Dinge auch. Also, entweder Geduld haben, in 10 Jahren oder so wird MySQL vielleicht ähnlich leistungsfähig wie PostgreSQL heute sein. Oder halt umsteigen.
 
Werbung:
Diese Reihe mit dem veränderten Wert sollte dann auch angezeigt werden.

Bei MySQL wirst du auf ein Timestamp Attribut zurück greifen müssen. Damit kannst du dann das zuletzt geänderte Tupel auswählen. Abhängig davon ob du in einer Multi-User Umgebung arbeitest und ob du das Feld "manuell" auf NOW() setzt musst du gegebenenfalls noch mit Transaktionen arbeiten.

Gruß
Hony
 
Zurück
Oben