gpt4 book ai didi

mysql - SQL:使用 UNION 或子查询后无法使用 UPDATE 子句,而类似的 SELECT 仍然有效

转载 作者:行者123 更新时间:2023-11-29 16:14:48 27 4
gpt4 key购买 nike

所以我目前有一个具有以下结构的数据库:

  • wp_giantbomb_game_list(post_id,重要)

  • wp_game_attribute_company(ID,重要)

  • wp_game_relation_publisher(ID, game_id, attribute_id)

  • wp_game_relation_developer(ID, game_id, attribute_id)

重要标签是一个 bool 值,表示游戏是否重要。我目前所做的就是手动将公司设置为重要。我现在想创建一个查询,将所有游戏设置为重要,开发者或发行商设置为重要。发行商和开发者关系通过“game_relation”表给出,其中game_id链接到“wp_giantbomb_game_list”和“attribute_id”。

因此,我的第一个目标是尝试将两个关系表中的数据合并为一个。毕竟发行商或开发者是否被设置为“重要”与我无关。

我使用以下查询返回所有恰好拥有重要发布商或开发者的“game_id”标签

SELECT PUB.game_id FROM wp_game_relation_publisher PUB INNER JOIN 
wp_game_attribute_company COM ON PUB.attribute_id = COM.ID WHERE COM.important = 1
UNION SELECT DEV.game_id FROM wp_game_relation_developer DEV INNER JOIN
wp_game_attribute_company COM ON DEV.attribute_id = COM.ID WHERE COM.important = 1
ORDER BY game_id ASC;

这个查询非常快并且达到了目的。现在我只想将 game_id 与 WHERE IN 子句 ala

一起使用
SELECT * FROM `wp_giantbomb_game_list` GAMELIST WHERE GAMELIST.post_id IN (
SELECT PUB.game_id FROM wp_game_relation_publisher PUB INNER JOIN
wp_game_attribute_company COM ON PUB.attribute_id = COM.ID WHERE COM.important = 1
UNION SELECT DEV.game_id FROM wp_game_relation_developer DEV INNER JOIN
wp_game_attribute_company COM ON DEV.attribute_id = COM.ID WHERE COM.important = 1
ORDER BY game_id ASC);

这个查询根本不起作用。 PHPMyAdmin 根本没有响应,导致我重新加载该网站。然后,我尝试了一种不使用 UNION 的解决方法,只需在 WHERE IN 子句中添加 OR 即可。

SELECT * FROM `wp_giantbomb_game_list` GAMELIST WHERE GAMELIST.post_id IN(
SELECT PUB.game_id FROM wp_game_relation_publisher PUB INNER JOIN
wp_game_attribute_company COM ON PUB.attribute_id = COM.ID WHERE COM.important = 1)
or GAMELIST.post_id IN (SELECT DEV.game_id FROM wp_game_relation_developer DEV INNER JOIN
wp_game_attribute_company COM ON DEV.attribute_id = COM.ID WHERE COM.important = 1 );

这有效,但随后使用类似的更新语句导致 PHPMyAdmin 不再使用react。

UPDATE `wp_giantbomb_game_list` GAMELIST SET important = 1 WHERE GAMELIST.post_id IN(
SELECT PUB.game_id FROM wp_game_relation_publisher PUB INNER JOIN
wp_game_attribute_company COM ON PUB.attribute_id = COM.ID WHERE COM.important = 1)
or GAMELIST.post_id IN (SELECT DEV.game_id FROM wp_game_relation_developer DEV INNER JOIN
wp_game_attribute_company COM ON DEV.attribute_id = COM.ID WHERE COM.important = 1 );

所以现在我根本不知道发生了什么。因此,我的问题是,有人知道发生了什么事吗?有人知道如何解决这个问题吗?

非常感谢提前来到这里的任何人!

最佳答案

尝试使用EXISTS:

UPDATE `wp_giantbomb_game_list` gl
SET important = 1
WHERE EXISTS (SELECT 1
FROM wp_game_relation_publisher p INNER JOIN
wp_game_attribute_company c
ON p.attribute_id = c.ID
WHERE c.important = 1 AND gl.post_id = p.game_id
) OR
EXISTS (SELECT 1
FROM wp_game_relation_developer d INNER JOIN
wp_game_attribute_company c
ON d.attribute_id = c.ID
WHERE d.important = 1 AND gl.post_id = d.game_id
) ;

然后,这可以利用以下索引:

  • wp_game_relation_publisher(post_id, attribute_id)
  • wp_game_attribute_company(id,重要)
  • wp_game_relation_developer(game_id, attribute_id)

关于mysql - SQL:使用 UNION 或子查询后无法使用 UPDATE 子句,而类似的 SELECT 仍然有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54925126/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com