Toon posts:

[MYSQL] Subquery wegwerken in update

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit met de volgende situatie: een forum heeft de tabellen user en post, en in elke entry van post staat een verwijzing naar de users-table. Nu zijn er echter users uit deze table verwijderd en is het de bedoeling dat de verwijzing naar users -1 krijgt. Dit zou vrij makkelijk kunnen:
SQL:
1
UPDATE post SET user_id=-1 WHERE user_id NOT IN (SELECT id FROM user)

Maar goed, we werken hier met MySQL 4.0, dus subqueries zijn niet mogelijk. Bij select kan je dit nog vrij makkelijk omzeilen, gewoon left joinen en dan where user_id is null. Hoe doe ik dit bij een update, of is het makkelijker er even een php-scriptje omheen te gooien?

  • Morax
  • Registratie: Mei 2002
  • Laatst online: 21:12
Misschien eerst alle ID's ophalen van posts van die user, en dan vervolgens een update met daar in een where clause van WHERE ID IN () met daarin alle ID's van posts die je net opgehaald hebt? :)

[ Voor 5% gewijzigd door Morax op 21-09-2005 14:06 ]

What do you mean I have no life? I am a gamer, I got millions!


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Je kunt toch ook gewoon left joinen en checken op null in een update?

SQL:
1
2
3
4
5
UPDATE post
SET user_id = -1
FROM post
LEFT OUTER JOIN user ON post.user_id = user.user_id
WHERE user.user_id IS NULL

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
P_de_B schreef op woensdag 21 september 2005 @ 14:08:
Je kunt toch ook gewoon left joinen en checken op null in een update?

SQL:
1
2
3
4
5
UPDATE post
SET user_id = -1
FROM post
LEFT OUTER JOIN user ON post.user_id = user.user_id
WHERE user.user_id IS NULL
Hier heb ik allemaal varianten van geprobeerd, maar mysql blijft een fout geven

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

UPDATE post LEFT JOIN ...

en dan de rest ook geprobeerd? Zie de mysql-documentatie over de precieze syntax voor multi-table-updates.

[ Voor 3% gewijzigd door ACM op 21-09-2005 14:58 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
hier en hier staat informatie hierover. Dit zou moeten werken volgens mij:

SQL:
1
2
3
4
UPDATE post 
LEFT OUTER JOIN user ON post.user_id = user.user_id 
SET user_id = -1 
WHERE user.user_id IS NULL

Oops! Google Chrome could not find www.rijks%20museum.nl


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 30-04 14:27
Vaag datamodel...

Zodra je hierna gaat zoeken op posts van poster -1, krijg je er wel heel veel terug.

Of als je in een topic kijkt:
Bericht 1: User 1
Bericht 2: --USER DELETED--
Bericht 3: --USER DELETED--
Bericht 4: User 1

Zijn bericht 2 en 3 nu door dezelfde persoon geschreven of niet?

Is het niet handiger om gewoon de accounts te disablen? Dan houdt je post-history nog een beetje duidelijk ook.

Verwijderd

Topicstarter
jvdmeer schreef op woensdag 21 september 2005 @ 16:24:
Is het niet handiger om gewoon de accounts te disablen? Dan houdt je post-history nog een beetje duidelijk ook.
Dat is wat ik ook maar aan de verantwoordelijke persoon heb doorgegeven.

De oplossing van P_de_B werkt in ieder geval, zelf zie ik dat zo niet echt in de gegeven links staan eigenlijk

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op woensdag 21 september 2005 @ 18:58:
[...]

De oplossing van P_de_B werkt in ieder geval, zelf zie ik dat zo niet echt in de gegeven links staan eigenlijk
Het is soms ook best lastig :)
quote: help mysql
Multiple-table syntax:

UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
Bovenstaande is dus de syntax voor een multi table update, en een stukje verder op staat:
The table_references part lists the tables involved in the join. Its syntax is described in Section 13.2.7.1, “JOIN Syntax”.
Het 2e linkje van mij verwijst dus naar de join syntax.
MySQL supports the following JOIN syntaxes for the table_references part of SELECT statements and multiple-table DELETE and UPDATE statements:

table_reference, table_reference
table_reference [INNER | CROSS] JOIN table_reference [join_condition]
table_reference STRAIGHT_JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference join_condition
Daar kun je het dus vinden.

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1