在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,并且也可以用于其他数据库。