Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用UNION对子查询进行内部联接_Mysql_Sql - Fatal编程技术网

Mysql 使用UNION对子查询进行内部联接

Mysql 使用UNION对子查询进行内部联接,mysql,sql,Mysql,Sql,我有一个SQL查询来更新照片的旋转偏移。查询应将1添加到值中,除非值为3,否则在这种情况下,应将其设置回0,如中所示,4个90度旋转批次与根本不旋转相同 我不确定下面的内容是否是最有效的方法,我希望能提供一些更简单的解决方案,这些解决方案不需要我像以前那样列出映射 然而,我的问题是,为什么会出现MySQL语法错误?当我自己使用SELECT子查询时,它会按预期返回结果 UPDATE `photos` p SET p.rotational_offset=map.new_value INNER JOI

我有一个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";

首先,一个更简单的解决方案是使用操作符%:

UPDATE photos
SET rotational_offset = (rotational_offset + 1) % 4
WHERE photo_id = '22'
在线查看它的工作情况:

现在来回答你的问题。。。您会收到一个错误,因为您没有为多表使用正确的语法。表引用位于SET子句之前。正确的语法如下所示:

UPDATE [LOW_PRIORITY] [IGNORE]
table_references
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
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'
您的语句不起作用,因为您将内部联接放在SET子句之后。更正版本如下:

UPDATE [LOW_PRIORITY] [IGNORE]
table_references
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
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'

首先,一个更简单的解决方案是使用操作符%:

UPDATE photos
SET rotational_offset = (rotational_offset + 1) % 4
WHERE photo_id = '22'
在线查看它的工作情况:

现在来回答你的问题。。。您会收到一个错误,因为您没有为多表使用正确的语法。表引用位于SET子句之前。正确的语法如下所示:

UPDATE [LOW_PRIORITY] [IGNORE]
table_references
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
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'
您的语句不起作用,因为您将内部联接放在SET子句之后。更正版本如下:

UPDATE [LOW_PRIORITY] [IGNORE]
table_references
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
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'

天才解决方案,谢谢。为了实现同样的效果,但是减少偏移量而不是增加偏移量,我发现CASE构造可以很好地工作:当rotational_offset-1<0时更新photos SET rotational_offset=CASE,然后3否则rotational_offset-1结束,photo_id='22';天才解决方案,谢谢。为了实现同样的效果,但是减少偏移量而不是增加偏移量,我发现CASE构造可以很好地工作:当rotational_offset-1<0时更新photos SET rotational_offset=CASE,然后3否则rotational_offset-1结束,photo_id='22';