【问题标题】:SQL query error, need some assistanceSQL查询错误,需要帮助
【发布时间】:2012-03-15 06:41:39
【问题描述】:

我有一个查询应该退还人们在过去一周购买的东西的一半:

UPDATE main_data SET md.amount_current = md.amount_current + (bought.total / 2) 
FROM main_data AS md 
INNER JOIN (
    SELECT DISTINCT sb.user_id, SUM(sb.spend) AS total 
    FROM shopitems_bought AS sb 
    LEFT JOIN shopitems AS si 
    ON sb.shopitem_id = si.id 
    WHERE sb.date_bought <= '2012-03-09' 
    AND sb.date_bought > DATE_ADD('2012-03-09', INTERVAL -7 DAY) 
    AND si.valid = 1 
    GROUP BY sb.user_id
) AS bought ON bought.user_id = md.user_id 
WHERE md.valid = 1

SELECT 部分可以自行执行并返回正确的数据(应退还的 ID 以及他们在该周花费的金额)。然而,查询作为一个整体抛出一个错误,说我在第 2 行附近的 SQL 语法中有错误(我引用:'FROM main_data AS md INNER JOIN(SELECT DISTINCT sb.forum_id,SUM(sb.s')。

我看不出我做错了什么。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    MySql uses a different syntax for join with update statements 比您上面使用的要多。尝试将您的查询更改为:

    UPDATE main_data md 
    INNER JOIN (
        SELECT DISTINCT sb.user_id, SUM(sb.spend) AS total 
        FROM shopitems_bought AS sb 
        LEFT JOIN shopitems AS si 
        ON sb.shopitem_id = si.id 
        WHERE sb.date_bought <= '2012-03-09' 
        AND sb.date_bought > DATE_ADD('2012-03-09', INTERVAL -7 DAY) 
        AND si.valid = 1 
        GROUP BY sb.user_id
    ) bought ON bought.user_id = md.user_id 
    SET amount_current = md.amount_current - (bought.total / 2) 
    WHERE md.valid = 1
    

    注意,我改了

    SET amount_current = md.amount_current + (bought.total / 2) 
    

    用减法代替加法:

    SET amount_current = md.amount_current - (bought.total / 2) 
    

    【讨论】:

    • 谢谢,解决了!所有这些不同的 SQL 版本都很烦人。
    【解决方案2】:

    INNER JOIN 中没有user_Id

    UPDATE main_data SET md.amount_current = md.amount_current + (bought.total / 2) 
    FROM main_data AS md 
    INNER JOIN (
        SELECT sb.user_id, DISTINCT sb.forum_id, SUM(sb.spend) AS total 
        FROM shopitems_bought AS sb 
        LEFT JOIN shopitems AS si 
        ON sb.shopitem_id = si.id 
        WHERE sb.date_bought <= '2012-03-09' 
        AND sb.date_bought > DATE_ADD('2012-03-09', INTERVAL -7 DAY) 
        AND si.valid = 1 
        GROUP BY sb.user_id
    ) AS bought ON bought.user_id = md.user_id 
    WHERE md.valid = 1
    

    【讨论】:

    • 哦,等一下,那是我的错,我稍微“混淆”了实际代码。 sb.forum_id 应该是 sb.user_id
    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 2016-07-04
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2011-03-14
    相关资源
    最近更新 更多