2012-03-14 7 views
2

Я получил этот запрос, который должен возместить людям половину материала, который они купили на прошлой неделе:SQL ошибка запроса, нужна помощь

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, часть выполняет только штраф самостоятельно и возвращает право данные (идентификаторы, которые должны быть возвращены и сколько они тратят на этой неделе). Однако запрос в целом вызывает ошибку, говоря, что у меня есть ошибка в синтаксисе SQL около строки 2 (я цитирую: «FROM main_data AS md INNER JOIN (SELECT DISTINCT sb.forum_id, SUM (sb.s»).

я не могу видеть, что я делаю неправильно

ответ

3

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) 

T о вычитать вместо оных:

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

Спасибо, что решили его! Все эти разные версии SQL раздражают. – Clavus

0

Существует нет user_Id внутри INNER JOIN не

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 
+0

Ой, подождите, это мое плохое, я «запутал» фактический код. sb.forum_id должен быть sb.user_id – Clavus

+0

@Clavus, создать демо вашей проблемы как [sqlfiddle] (http://sqlfiddle.com) – Starx

Смежные вопросы