[php/sql]Niet meegegeven kolomwaarde ophalen na update query

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een update query voor een tabel in MySQL en probeer het volgende:

tabel: orders
kolommen: id, nummer, omschrijving, klant_id, datum

nu wil ik een update query uitvoeren op nummer dus alle orders met nummer 314 update, maar ik wil dan ook weten welke id's ik geupdated heb, kan ik hier achter komen zonder weer een select query te gebruiken?

*natuurlijk heb ik gezocht maar niets gevonden

[ Voor 8% gewijzigd door Verwijderd op 26-10-2005 14:47 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Kort antwoord: nee.

Edit:
Lang antwoord: waarom wil je dit weten? En als je dit wilt weten, wat is het probleem van het eerst selecteren van alle ID's met dat nummer om die vervolgens met een UPDATE statement aan te passen?

[ Voor 89% gewijzigd door Verwijderd op 26-10-2005 14:56 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik vind het wel een zware actie om twee queries uit te voeren op alleen de affected rows en daarvan de Id op te halen...

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 11-09 13:55
Bij een update voeg je gegevens in de tabel in.. bij een select lees je ze eruit. Dat kun je niet in 1 query doen, en is ook nergens goed voor.

Je kunt wel opvragen hoeveel records je hebt geupdate met mysql_affected_rows(). Maar voor de ID's van die recrods zul je toch echt een SELECT moeten doen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
frickY schreef op woensdag 26 oktober 2005 @ 14:55:
Bij een update voeg je gegevens in de tabel in.. bij een select lees je ze eruit. Dat kun je niet in 1 query doen, en is ook nergens goed voor.

Je kunt wel opvragen hoeveel records je hebt geupdate met mysql_affected_rows(). Maar voor de ID's van die recrods zul je toch echt een SELECT moeten doen.
ik kan me toch wel voorstellen dat het wel ergens goed voor is, ik wil een uniek id hebben van de row die geupdated heb zodat ik em daarna terug kan vinden...Lijkt me toch een vrij veel voorkomende actie. Nu moet ik het dus in twee queries doen...

Acties:
  • 0 Henk 'm!

  • Huppie
  • Registratie: Mei 2003
  • Laatst online: 02-09 09:59
Misschien een wat rare vraag hoor...maar waarom zou je die ID's willen hebben dan?

Proud member of TCF - D2OL is zooooo 2005


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik moet die id's hebben om later een insert te doen in een andere tabel met die id's. Maar nu ik er over na denk, mysql zou een intern record nummer terug kunnen geven welke rows er aangepast zijn , en ik zou die records weer kunnen zoeken.

[ Voor 51% gewijzigd door Verwijderd op 26-10-2005 15:05 ]


Acties:
  • 0 Henk 'm!

  • bakkerl
  • Registratie: Augustus 2001
  • Laatst online: 01-09 19:17

bakkerl

Let there be light.

Voor SQL zijn en blijven dit aparte queries.
Wil je het perse met 1 actie richting de database doen, zul je StoredProcedures (SP) gaan maken welke beide acties voor jou direct doen. Vanaf Mysql 5.0 (deze week officiceel uit) worden SP's ondersteund.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
bakkerl schreef op woensdag 26 oktober 2005 @ 15:05:
Voor SQL zijn en blijven dit aparte queries.
Wil je het perse met 1 actie richting de database doen, zul je StoredProcedures (SP) gaan maken welke beide acties voor jou direct doen. Vanaf Mysql 5.0 (deze week officiceel uit) worden SP's ondersteund.
Ik vind mysql 5 erg interessant maar mijn bedrijf niet :P
Maar het is me duidelijk en doe wel een select query

[ Voor 7% gewijzigd door Verwijderd op 26-10-2005 15:09 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Als ik het goed begrijp kan je het als volgt oplossen:
1) Doe een SELECT id WHERE nummer = 314
2) Doe een UPDATE orders SET kolom = waarde WHERE id IN (<hier alle ID's van 1>)
3) Doe voor iedere ID uit 1) : INSERT INTO tabel (kolom1, kolom2) VALUES (waarde1, waarde2)

Ik vind dat helemaal niet zo verschrikkelijk zwaar, en met wat slimme indexen moet er iets raars gebeuren om slechte performance te krijgen. De meest 'zware' stap zal mijns inziens stap 3 zijn, zeker met een groot aantal waardes uit 1. Vanuit dat perspectief maakt die 1 extra select weinig meer uit.

[ Voor 18% gewijzigd door Verwijderd op 26-10-2005 15:17 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 26 oktober 2005 @ 15:15:
Als ik het goed begrijp kan je het als volgt oplossen:
1) Doe een SELECT id WHERE nummer = 314
2) Doe een UPDATE orders SET kolom = waarde WHERE id IN (<hier alle ID's van 1>)
3) Doe voor iedere ID uit 1) : INSERT INTO tabel (kolom1, kolom2) VALUES (waarde1, waarde2)

Ik vind dat helemaal niet zo verschrikkelijk zwaar, en met wat slimme indexen moet er iets raars gebeuren om slechte performance te krijgen. De meest 'zware' stap zal mijns inziens stap 3 zijn, zeker met een groot aantal waardes uit 1. Vanuit dat perspectief maakt die 1 extra select weinig meer uit.
Een soortgelijke oplossing gebruik ik nu, maar ik vond het vreemd dat je niet eens een interne pointer terug kon krijgen

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je kan het ook nog met een Select Into doen.
SQL:
1
2
3
4
5
6
7
8
9
10
UPDATE Orders
SET kolom = waarde
WHERE nummer = 314

en daarna

SELECT id
INTO andereTabel
FROM orders
WHERE nummer = 314

Het enige probleem is dat je vanuit de database geen garantie hebt dat er tussen de 2 queries nog meer veranderd aan de records en dat het dus niet meer klopt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • bakkerl
  • Registratie: Augustus 2001
  • Laatst online: 01-09 19:17

bakkerl

Let there be light.

rwb schreef op woensdag 26 oktober 2005 @ 15:33:
Het enige probleem is dat je vanuit de database geen garantie hebt dat er tussen de 2 queries nog meer veranderd aan de records en dat het dus niet meer klopt.
En daar hebben ze transacties voor uitgevonden.

(Wel InnoDB data engine gebruiken onder MySQL4.x dan :)

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
bakkerl schreef op woensdag 26 oktober 2005 @ 15:40:
[...]


En daar hebben ze transacties voor uitgevonden.

(Wel InnoDB data engine gebruiken onder MySQL4.x dan :)
Ik dacht dat MySQL dat pas vanaf versie 5 ondersteunde.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1