使用UNION在子查询上进行INNER JOIN

时间:2012-11-30 16:25:12

标签: mysql sql

我有一个SQL查询来更新照片的旋转偏移。查询应该为值加1,除非值为3,在这种情况下它应该将其设置为0(因为,4批90度旋转与完全没有旋转相同)。

我不确定下面的内容是否是最有效的方式,我很欣赏更简单的解决方案的建议,这些解决方案不需要我列出像我一样的映射。

但是,我的问题是,为什么我会收到MySQL语法错误?当我自己使用SELECT子查询时,它会按预期返回结果。

UPDATE `photos` p SET p.rotational_offset=map.new_value INNER JOIN (
SELECT 0 AS rotational_offset, 3 AS new_value
UNION SELECT 1 , 0
UNION SELECT 2 , 1
UNION SELECT 3 , 2
) map ON p.rotational_offset=map.rotational_offset WHERE p.photo_id="22";

1 个答案:

答案 0 :(得分:4)

首先,一个更简单的解决方案是使用MOD运算符(%):

UPDATE photos
SET rotational_offset = (rotational_offset + 1) % 4
WHERE photo_id = '22'

查看在线工作:sqlfiddle


现在要实际回答你的问题......你得到一个错误,因为你没有使用多表update的正确语法。表引用首先出现在SET子句之前。正确的语法如下:

UPDATE [LOW_PRIORITY] [IGNORE]
table_references
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]

您的语句不起作用,因为您将内部联接放在SET子句之后。更正后的版本如下:

UPDATE photos AS p
INNER JOIN
(
    SELECT 0 AS rotational_offset, 3 AS new_value
    UNION ALL SELECT 1 , 0
    UNION ALL SELECT 2 , 1
    UNION ALL SELECT 3 , 2
) AS map
ON p.rotational_offset = map.rotational_offset 
SET p.rotational_offset=map.new_value
WHERE photo_id = '22'
相关问题