[SQL] Veld updaten onder voorwaarde

Pagina: 1
Acties:

  • netiul
  • Registratie: December 2001
  • Laatst online: 02-05 14:00
SQL:
1
UPDATE triviant SET antwoord='".addslashes($answer)."', aantalkeer=aantalkeer+1, gemtijd=(gemtijd*aantalkeer+".$answertime.")/(aantalkeer+1), recordtijd=LEAST(recordtijd,".$answertime."), recorddoor='".$answeredby."' WHERE vraagnr='".$trivianextqunr."'


Deze bovenstaande (mysql) query update een record (O-)). Het update het veld 'recordtijd' wanneer de nieuwe tijd kleiner is dan de bestaande tijd. Dat werkt.

Echter is de update van het veld 'recorddoor' afhankelijk van of het een nieuw record is of niet. Is hier een soort constructie voor te bedenken? Een soort if-constructie o.i.d...

De manual zegt er niet veel over, maar die zei ook niet dat de LEAST() function ook werkte bij UPDATE queries, dus dat zegt misschien niet zo veel.

Hmm, zit er al een poosje mee. Kom er niet echt uit. Ik kan natuurlijk een extra query gebruiken, maar dat vind ik zonde tbh.

[ Voor 12% gewijzigd door netiul op 05-08-2005 23:08 ]


Verwijderd

PHP:
1
"... recorddoor = IF(recordtijd < " . $answertime . ", recorddoor, '" . $answeredby . "') ..."

  • netiul
  • Registratie: December 2001
  • Laatst online: 02-05 14:00
Duidelijk.

Thx!

[ Voor 6% gewijzigd door netiul op 05-08-2005 23:18 ]


  • netiul
  • Registratie: December 2001
  • Laatst online: 02-05 14:00
Nog wat kanttekeningen.

Er zijn meer dingen die fout gaan in de query. Ten eerste hoeft bij het update van veld 'gemtijd' niet onnieuw 'aantalkeer' met 1 opgehoogd worden, want blijkbaar worden voorgaande velden per direct geupdate. Daarom ging het updaten van 'recorddoor' zoals Cheatah dat doorgaf ook fout, omdat het veld 'recordtijd' waar die naar verwijst eerst geupdate wordt naar de nieuwe waarde en je dus niet meer kunt checken of het nieuw record is of niet. Oplossing is gewoon door eerst 'recorddoor' te updaten en dan pas 'recordtijd'.

Correct:
SQL:
1
UPDATE triviant SET antwoord='".addslashes($answer)."', aantalkeer=aantalkeer+1, gemtijd=(gemtijd*aantalkeer+".$answertime.")/(aantalkeer), recorddoor=IF(recordtijd > 0 AND recordtijd<".$answertime.",recorddoor,'".$answeredby."'), recordtijd=IF(recordtijd > 0 AND recordtijd < ".$answertime.", recordtijd, ".$answertime.") WHERE vraagnr='".$trivianextqunr."'

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 14:59

ripexx

bibs

Replicator schreef op zaterdag 06 augustus 2005 @ 01:45:
SQL:
1
UPDATE triviant SET antwoord='".addslashes($answer)."', aantalkeer=aantalkeer+1, gemtijd=(gemtijd*aantalkeer+".$answertime.")/(aantalkeer), recorddoor=IF(recordtijd > 0 AND recordtijd<".$answertime.",recorddoor,'".$answeredby."'), recordtijd=IF(recordtijd > 0 AND recordtijd < ".$answertime.", recordtijd, ".$answertime.") WHERE vraagnr='".$trivianextqunr."'
Zou in plaats van een samengestelde PHP string ook het echte volledige statement kunnen laten zien en het dan even netjes uitlijnen :)

bijv.
SQL:
1
2
3
UPDATE tabel
SET recorddoor = IF(recordtijd > 0 AND recordtijd < 1234, 'Pietje', 'Jantje')
WHERE vraagnr = 567;

Zoals je dan kan zien wordt het voor iedereen een stuk duidelijker
SQL:
1
2
3
4
5
6
7
UPDATE triviant 
SET antwoord='".addslashes($answer)."', 
    aantalkeer=aantalkeer+1, 
    gemtijd=(gemtijd*aantalkeer+".$answertime.")/(aantalkeer), 
    recorddoor=IF(recordtijd > 0 AND recordtijd<".$answertime.",recorddoor,'".$answeredby."'),
    recordtijd=IF(recordtijd > 0 AND recordtijd < ".$answertime.", recordtijd, ".$answertime.") 
WHERE vraagnr='".$trivianextqunr."'


Verder zie ik niet in waarom je zoveel logica in je SQL statement wil bakken. Check eerste de recordtijd in de database, en bepaal dan of er wel of geen update moet plaats vinden want dit soort queries vragen om problemen.

buit is binnen sukkel


Verwijderd

Hij wil sommige velden sowieso updaten. Vandaar die LEAST en IF constructie. Als je niet altijd wilt updaten ga je inderdaad met een WHERE clause aan de gang.

  • netiul
  • Registratie: December 2001
  • Laatst online: 02-05 14:00
ripexx schreef op zaterdag 06 augustus 2005 @ 09:53:
[...]

Zou in plaats van een samengestelde PHP string ook het echte volledige statement kunnen laten zien en het dan even netjes uitlijnen :)

[sql-code]
Idd een stuk duidelijker, bedankt voor de tip :)
Verder zie ik niet in waarom je zoveel logica in je SQL statement wil bakken. Check eerste de recordtijd in de database, en bepaal dan of er wel of geen update moet plaats vinden want dit soort queries vragen om problemen.
Zie comment van Cheatah, WHERE clausule is geen optie, want die heeft invloed op het updaten van alle velden :)

[ Voor 10% gewijzigd door netiul op 06-08-2005 12:28 ]

Pagina: 1