mysql - 使用 UNION 对子查询进行 INNER JOIN

标签 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";

最佳答案

首先,一个更简单的解决方案是使用 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'

关于mysql - 使用 UNION 对子查询进行 INNER JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13649096/

相关文章:

mysql - 差距检测 - 识别跳过/错过的日期

php - 解析错误: Help me solve my php error

SQL CHECK 约束问题

mysql - 计算 MySQL 表中时间戳内的天数

mysql - 需要更新主键,但如果更新的值存在,则删除该记录

MYSQL 按大小写排序

MySQL PHPMyAdmin - 例行错误

java - Glassfish MySQL Hibernate 无法构建 Hibernate SessionFactory

mysql - :first, :order in Rails 3? 的正确查找语法

MySQL数据库设计用户评分