My Testing and results at the bottom. Suspect a buggy implementation of 
the IF() calculation (see tests and results).

Kai Ruhnau <[EMAIL PROTECTED]> wrote on 12/28/2004 11:06:43 
AM:

> Zitat von [EMAIL PROTECTED]:
> 
> > Can you provide us a test case (sample table definitions and sample 
data)
> > ?
> 
> Sure.
> 
> --
> 
> CREATE TABLE table1 (
>   ID int(10) unsigned NOT NULL default '0',
>   condition int(10) unsigned NOT NULL default '0'
> ) TYPE=InnoDB;
> 
> INSERT INTO table1 VALUES (1,7);
> INSERT INTO table1 VALUES (2,8);
> 
> CREATE TABLE table2 (
>   ID int(10) unsigned NOT NULL default '0',
>   ID_table1 int(10) unsigned NOT NULL default '0',
>   value int(10) unsigned NOT NULL default '0'
> ) TYPE=InnoDB;
> 
> INSERT INTO table2 VALUES (1,1,5);
> INSERT INTO table2 VALUES (2,2,2);
> 
> --
> 
> And the query:
> 
> UPDATE table1
> INNER JOIN table2 ON table2.ID_table1=table1.ID
> SET table2.value=table2.value-IF(table1.condition=7,1,0),
>     table1.condition=8
> WHERE table1.ID IN (1,2)
> 
> After that the value's in table2 are still 5 and 2. But I would 
> expect the 5 to
> be a 4.
> 
> MySQL: 4.0.20
> 
> Greetings
> Kai

This worked:
UPDATE table1
LEFT JOIN table2 
        ON table2.ID_table1=table1.ID
        AND table1.condition=7
SET table2.value= table2.value-1,
    table1.condition=8
WHERE table1.ID IN (1,2);

localhost.test>select * from table1;
+----+-----------+
| ID | condition |
+----+-----------+
|  1 |         8 |
|  2 |         8 |
+----+-----------+
2 rows in set (0.00 sec)

localhost.test>select * from table2;
+----+-----------+-------+
| ID | ID_table1 | value |
+----+-----------+-------+
|  1 |         1 |     4 |
|  2 |         2 |     2 |
+----+-----------+-------+
2 rows in set (0.00 sec)

These did not:

UPDATE table1
INNER JOIN table2 ON table2.ID_table1=table1.ID
SET table2.value=table2.value-IF(table1.condition=7,1,0),
    table1.condition=8
WHERE table1.ID IN (1,2);

localhost.test>select * from table1;
+----+-----------+
| ID | condition |
+----+-----------+
|  1 |         8 |
|  2 |         8 |
+----+-----------+
2 rows in set (0.00 sec)

localhost.test>select * from table2;
+----+-----------+-------+
| ID | ID_table1 | value |
+----+-----------+-------+
|  1 |         1 |     5 |
|  2 |         2 |     2 |
+----+-----------+-------+
2 rows in set (0.00 sec)


UPDATE table1
INNER JOIN table2 ON table2.ID_table1=table1.ID
SET table2.value=IF(table1.condition=7,table2.value-1,table2.value),
    table1.condition=8
WHERE table1.ID IN (1,2);

localhost.test>select * from table1;
+----+-----------+
| ID | condition |
+----+-----------+
|  1 |         8 |
|  2 |         8 |
+----+-----------+
2 rows in set (0.00 sec)

localhost.test>select * from table2;
+----+-----------+-------+
| ID | ID_table1 | value |
+----+-----------+-------+
|  1 |         1 |     5 |
|  2 |         2 |     2 |
+----+-----------+-------+
2 rows in set (0.00 sec)

However when I tried the same update WITHOUT trying to update 
table1.condition in the same query, it worked every time:

UPDATE table1
INNER JOIN table2 ON table2.ID_table1=table1.ID
SET table2.value=IF(table1.condition=7,table2.value-1,table2.value)
WHERE table1.ID IN (1,2);

localhost.test>select * from table2;
+----+-----------+-------+
| ID | ID_table1 | value |
+----+-----------+-------+
|  1 |         1 |     4 |
|  2 |         2 |     2 |
+----+-----------+-------+
2 rows in set (0.00 sec)

UPDATE table1
INNER JOIN table2 ON table2.ID_table1=table1.ID
SET table2.value=(table2.value-IF(table1.condition=7,1,0))
WHERE table1.ID IN (1,2);

localhost.test>select * from table2;
+----+-----------+-------+
| ID | ID_table1 | value |
+----+-----------+-------+
|  1 |         1 |     4 |
|  2 |         2 |     2 |
+----+-----------+-------+
2 rows in set (0.00 sec)

UPDATE table1
INNER JOIN table2 ON table2.ID_table1=table1.ID
SET table2.value=table2.value-IF(table1.condition=7,1,0)
WHERE table1.ID IN (1,2);

localhost.test>select * from table2;
+----+-----------+-------+
| ID | ID_table1 | value |
+----+-----------+-------+
|  1 |         1 |     4 |
|  2 |         2 |     2 |
+----+-----------+-------+
2 rows in set (0.00 sec)

So -- This may be a bug in the way that my version (4.1.1a-alpha-nt-log) 
and yours prioritizes the IF() calculation. I guess it is checking the 
value AFTER table1.condition gets set to 8. However, I would have also 
assumed that table1.condition would have held it's ORIGINAL value of 7 
long enough to make your IF() condition true. Fortunately, I found a JOIN 
workaround that achieved the expected results. Let me know if you need any 
help adapting it to fit your actual tables.

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine

Reply via email to