Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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中使用DISTINCT SELECT更新表_Mysql_Sql Update - Fatal编程技术网

在mysql中使用DISTINCT SELECT更新表

在mysql中使用DISTINCT SELECT更新表,mysql,sql-update,Mysql,Sql Update,假设我有一个表,其中包含关于 game (PRIMARY INT id, TINYINT offline) 还有第二张表,其中包含该游戏的详细信息: gamedetail (PRIMARY INT id, INT game_id (fk to game table), TINYINT offline) 详细信息会从各种程序中频繁更新。在这里,我设置了细节的脱机标志。我不可能设置游戏本身的离线标志。(但是,如果我找到在线详细信息,我会将游戏的离线标志设置为0)。但我想通过更新查询在数据库中设

假设我有一个表,其中包含关于

game (PRIMARY INT id, TINYINT offline)
还有第二张表,其中包含该游戏的详细信息:

gamedetail (PRIMARY INT id, INT game_id (fk to game table), TINYINT offline) 
详细信息会从各种程序中频繁更新。在这里,我设置了细节的脱机标志。我不可能设置游戏本身的离线标志。(但是,如果我找到在线详细信息,我会将游戏的离线标志设置为0)。但我想通过更新查询在数据库中设置此信息。其理念是:

SELECT DISTINCT game.id FROM game 
    LEFT JOIN gamedetail AS gdon 
           ON (gdon.game_id = game.id AND gdon.offline = 0)
    LEFT JOIN gamedetail AS gdoff 
           ON (gdoff.game_id = game.id AND gdoff.offline = 1)
WHERE gdoff.id IS NOT NULL AND gdon.id IS NULL;
这给了我很好的所有游戏,我只有离线的游戏细节。因此,我想将此作为UPDATE语句的输入,如下所示:

UPDATE game SET game.offline=1 WHERE game id IN (
    SELECT DISTINCT game.id FROM game 
        LEFT JOIN gamedetail AS gdon 
               ON (gdon.game_id = game.id AND gdon.offline = 0)
        LEFT JOIN gamedetail AS gdoff 
               ON (gdoff.game_id = game.id AND gdoff.offline = 1)
    WHERE gdoff.id IS NOT NULL AND gdon.id IS NULL;

)
UPDATE game SET game.offline=1 WHERE game.id IN (
  SELECT * FROM (
    SELECT DISTINCT game.id FROM game 
        LEFT JOIN gamedetail AS gdon 
               ON (gdon.game_id = game.id AND gdon.offline = 0)
        LEFT JOIN gamedetail AS gdoff 
               ON (gdoff.game_id = game.id AND gdoff.offline = 1)
    WHERE gdon.id IS NOT NULL AND gdon.id IS NULL;
  ) t
)
不幸的是,这在mysql中失败了,因为
错误1093(HY000):表'game'被指定了两次,既作为'UPDATE'的目标,也作为数据的独立源

我的问题是如何将我的update语句更改为在mysql中工作的语句


编辑:更正WHERE条件

将查询包装在子查询中,如下所示:

UPDATE game SET game.offline=1 WHERE game id IN (
    SELECT DISTINCT game.id FROM game 
        LEFT JOIN gamedetail AS gdon 
               ON (gdon.game_id = game.id AND gdon.offline = 0)
        LEFT JOIN gamedetail AS gdoff 
               ON (gdoff.game_id = game.id AND gdoff.offline = 1)
    WHERE gdoff.id IS NOT NULL AND gdon.id IS NULL;

)
UPDATE game SET game.offline=1 WHERE game.id IN (
  SELECT * FROM (
    SELECT DISTINCT game.id FROM game 
        LEFT JOIN gamedetail AS gdon 
               ON (gdon.game_id = game.id AND gdon.offline = 0)
        LEFT JOIN gamedetail AS gdoff 
               ON (gdoff.game_id = game.id AND gdoff.offline = 1)
    WHERE gdon.id IS NOT NULL AND gdon.id IS NULL;
  ) t
)

只需使用一个简单的连接,不需要子查询

UPDATE game 
LEFT JOIN gamedetail AS gdon 
               ON (gdon.game_id = game.id AND gdon.offline = 0)
        LEFT JOIN gamedetail AS gdoff 
               ON (gdoff.game_id = game.id AND gdoff.offline = 1)
SET game.offline=1
    WHERE gdoff.id IS NOT NULL AND gdon .id IS NULL;

或者,如果您正在使用子查询,您需要提供一个新的别名,因为在更新查询中,您可以在where子句中指定相同的表,我想where条件应该是
where gdoff.id不为NULL,而gdon.id为NULL

thx,我更正了where条件。这是对实际表的简化,因此存在错误。我现在尝试一下你的建议,与外部连接相比,这个查询可能具有巨大的优势,因为它使用标准SQL,并且也可以用于其他数据库。