mysql - 将复杂的 mysql SELECT 转换为 UPDATE

标签 mysql join group-by having

我一直在尝试将复杂的 SELECT 查询转换为 UPDATE 查询,但我一直收到 1064 语法错误。

查询的目标是更新满足特定条件的某些行,但是连接以及 GROUP BY 和 HAVING 语句使我现在的查询无法做到这一点。我知道这不是正确的方法,但我找不到解决方案。如果有人能告诉我解决方案的方向,我会很棒!

我的查询(值不正确但提供了更多上下文):

UPDATE products p
JOIN products_to_specifications pts ON pts.products_id = p.products_id
JOIN products_specifications ps ON ps.specifications_id = pts.specifications_id
SET p.products_image = 'file_name.jpg'
WHERE ps.specifications_name IN ('color') 
AND pts.content IN ('black')
AND p.products_manufacturer = 'BMW'
AND p.products_name = 'M5'
GROUP BY p.products_id
HAVING COUNT(DISTINCT ps.specifications_name) = 1 AND COUNT(DISTINCT pts.content) = 1

我的表结构:

表格产品:products_id、products_image等(每个产品的基本信息相同)

表 products_specifications: specifications_id,specifications_name

表 products_to_specifications: products_id、specifications_id、content

我认为对于正确的解决方案我将使用子查询,但我不确定如何构建查询

最佳答案

MySql 不支持在 UPDATE 语句中使用 GROUP BY。您可以通过将复杂查询作为派生表来轻松更新,如下所示。

UPDATE products p, (SELECT p.products_id FROM products p
JOIN products_to_specifications pts ON pts.products_id = p.products_id
JOIN products_specifications ps ON ps.specifications_id = pts.specifications_id
WHERE ps.specifications_name IN ('color') 
AND pts.content IN ('black')
AND p.products_manufacturer = 'BMW'
AND p.products_name = 'M5'
GROUP BY p.products_id
HAVING COUNT(DISTINCT ps.specifications_name) = 1 AND COUNT(DISTINCT pts.content) = 1) AS t
SET p.products_image = 'file_name.jpg' WHERE p.products_id=t.products_id

希望对你有帮助。

关于mysql - 将复杂的 mysql SELECT 转换为 UPDATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8219839/

相关文章:

mysql - 重复行 SQL 查询

php - MySQL varchar 的错误顺序

sql - postgreSQL 错误中的 WHERE 子句中不允许聚合

php - 将第二个表的最新行连接到第一个表的每一行

mysql - 统计时间间隔内的数据数量超过

mysql - 包含连接的 SQL 查询

php - ASCII 编码字符串的问题 - PHP

php - MySQL 查询执行时间过长。查询返回良好结果,但可能设计不佳

SQL如何按时间段分组

sql - T-SQL 动态 GROUP BY 使用@parameters