Rhino, I hate to burst your bubble but JOINS __are allowed__ in MySQL
updates. I use them all the time.
http://dev.mysql.com/doc/mysql/en/UPDATE.html
At the top of the page are the syntaxes for single-table and
multiple-table updates:
The key here is that whatever you put _between_ the words FROM and WHERE
in a normal query will be what you need to UPDATE. (I personally
discourage anyone from using the "comma join" method of declaring table
joins so I won't use it in my examples. It's a valid syntax but if you
forget to put the right comparisons into your WHERE clause, you end up
with problems. It's even easier with using JOINS in an UPDATE as the
WHERE
clause is even farther away from the tables)
This query will give me a list of all of the companies who have contracts
managed by manager 15:
SELECT DISTINCT t1.*
FROM Company t1
INNER JOIN Contract t2
on t1.id = t2.Company_id
WHERE t2.Manager_ID = 15
Imagine a situation where you needed to update contract.ManagerID with a
new manager (Manager 15 was promoted) but you are not reassigning ALL of
the contract accounts to the same person. You want to split it up so that
companies A-L go to manger 12 and companies M-Z to manager 34. You *CAN*
do this in a single statement but that would confuse my example. I will
do
the reassignments in two statements so that you can see the pattern
better:
UPDATE Company t1
INNER JOIN Contract t2
on t1.id = t2.Company_ID
SET t2.Manager_Id = 12
WHERE t2.Manager_ID = 15
AND t1.Name <'m';
UPDATE Company t1
INNER JOIN Contract t2
on t1.id = t2.Company_ID
SET t2.Manager_Id = 34
WHERE t2.Manager_ID = 15
AND t1.Name >= 'm';
The WHERE clause didn't need to change but what came after the FROM in a
query has been moved to right after the UPDATE. The SET clause can
assign
values to or get values from ANY column from any of the tables
participating in the UPDATE clause. Let me get back on topic...
Bruce, you started with this SELECT:
SELECT u1.urltype as type,
p1.fileID as fileID,
l1.process as process,
l1.status as status
FROM university_urlTBL as u1
RIGHT JOIN parsefileTBL as p1
on u1.ID =p1.university_urlID
INNER JOIN latestParseStatusTBL as l1
on p1.fileID = l1.itemID
WHERE u1.universityID='40';
You should be able to transform this query into:
UPDATE university_urlTBL as u1
RIGHT JOIN parsefileTBL as p1
on u1.ID =p1.university_urlID
INNER JOIN latestParseStatusTBL as l1
on p1.fileID = l1.itemID
SET ....
WHERE ...
Your SET and WHERE clauses can refer to any column in any of the three
tables participating in the JOINs. Guessing from your example they would
look like
SET l1.process = '1', l1.status = '13'
WHERE u1.universityID = '40'
<BEGIN RANT>
If "process", "status", and "universityID" are numeric fields... DROP
THOSE QUOTES. They are not necessary and require the engine to take an
extra conversion.
<END RANT>
sorry... just had to get that off my chest. :-D
Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine
"Rhino" <[EMAIL PROTECTED]> wrote on 09/14/2004 01:24:19 PM:
----- Original Message -----
From: "bruce" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Tuesday, September 14, 2004 11:45 AM
Subject: update/join question..
> hi...
>
> a question on how to do an update on a table that depends on
'left/right'
> joins with other tables...
>
> i have the following select that works.
>
> select
> u1.urltype as type,
> p1.fileID as fileID,
> l1.process as process,
> l1.status as status
> from university_urlTBL as u1
> right join parsefileTBL as p1
> on u1.ID =p1.university_urlID
> join latestParseStatusTBL as l1
> on p1.fileID = l1.itemID
> where u1.universityID='40';
>
>
> i simply wnat to be able to update the latestParseStatusTBL based upon
the
> joins between the tables...
>
> (something like...)
> update
> latestParseStatusTBL,
> university_urlTBL as u1
> right join parsefileTBL as p1
> on u1.ID =p1.university_urlID
> join latestParseStatusTBL as l1
> on p1.fileID = l1.itemID
> where u1.universityID='40'
> set
> l1.process = '1',
> l1.status = '13';
>
> i've tried a number of derivatives of this approach with no luck.. i'm
> missing something simple..
>
You haven't explained what you meant by "with no luck"; did the updates
fail
with an error message or without a message? If there was a message, what
did
it say? I'm guessing that they failed with an error message but that the
message was cryptic....
I'm not overly fluent with MySQL yet but in 20 years of using DB2, I've
always been told that you can't update a join, you can only update an
individual table. I assume that is true of all relational databases,
including MySQL, but I don't know that for an absolute fact.
> searching through mysql.com/google hasn't shed much light!!
>
Perhaps because this is such a fundamental concept that no one thought
it
worth putting in a manual; they just assumed it would be told to you
wherever you learned basic relational concepts. If so, that is assuming
that
everyone working with relational databases had some exposure to theory
first; I think that's a very dubious assumption.
> any ideas/comments/asssistance/thoughts/etc..
>
There ought to be a clear error message every time you try to update,
insert, or delete from a join that says these operations cannot be done
on
joins. The manuals for every relational database should state that
Insert,
Update, and Delete do not work on joins, both in the reference section
for
the Insert, Update, and Delete statements and in the concepts section.
Rhino
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]