【问题标题】:Converting complex mysql SELECT into UPDATE将复杂的 mysql SELECT 转换为 UPDATE
【发布时间】:2023-03-20 03:23:01
【问题描述】:

我一直在尝试将复杂的 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、内容

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

【问题讨论】:

    标签: mysql join group-by having


    【解决方案1】:

    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
    

    希望对你有所帮助。

    【讨论】:

    • 即使我看不到整个代码...我认为有一个错字!您需要更换 p。与 t。在整个 SELECT 中(否则您无法通过 t.products_id 在最后一个 WHERE 中访问它)
    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多