Обновление вложенного запроса в Mysql? - PullRequest
0 голосов
/ 30 января 2012

У меня следующий запрос:

SELECT `peers`.uid, `user`.userid FROM `peers`, `user` WHERE `user`.userid = `peers`.uid

ФФ. является результатом запроса

userid,uid
1,1
1,1
1,1
3,3
96,96
96,96

Чтобы обновить результат, у меня есть настройка запроса ff:

UPDATE `user`
   INNER JOIN (    
   SELECT `peers`.uid, `user`.userid FROM `peers`, `user` WHERE `user`.userid = `peers`.uid
       ) AS my_current_select ON `user`.userid = my_current_select.userid
   SET `user`.credits = `user`.credits + 0.25

Тем не менее, запрос на обновление обновляется только 3 раза, каждый плюс 0,25 кредита в ID пользователя 1,3,96

Это не то, что я хочу. Я хочу однозначно добавить 0,25 кредитов в каждую строку результата запроса.
Например:

UID 1: UID1.credit = UID1.credit + 0.25 * 3 
UID 3: UID3.credit = UID3.credit + 0.25 * 1 
UID 3: UID96.credit = UID96.credit + 0.25 * 2

Как мне достичь этого результата?

Ответы [ 3 ]

4 голосов
/ 30 января 2012

Возможно, измените свой внутренний запрос на:

SELECT `user`.userid, COUNT(`peers`.uid) as count 
FROM `peers`, `user` 
WHERE `user`.userid = `peers`.uid 
GROUP BY `user`.userid

, чтобы получить:

userid,count
1,3
3,1
96,2

А затем в своем основном запросе выполните:

UPDATE `user`
   INNER JOIN (    
   SELECT `user`.userid, COUNT(`peers`.uid) as count 
    FROM `peers`, `user` 
    WHERE `user`.userid = `peers`.uid 
    GROUP BY `user`.userid
       ) AS my_current_select ON `user`.userid = my_current_select.userid
   SET `user`.credits = `user`.credits + 0.25*my_current_select.count
0 голосов
/ 30 января 2012
update u
set u.credit = u.credit + (0.25 * c.credits)
from user u
join (select us.userid, count(p.uid) as credits
      from user us join peers p on us.userid = p.uid
      group by us.userid) c
     on u.userid = c.userid

Действительно, обратные пометки совершенно не нужны, если в именах таблиц нет специальных символов или зарезервированных слов. Я также предпочитаю ставить предложение SET первым, что, как мне кажется, помогает с удобочитаемостью (указав, что вы намерены делать в первую очередь, до определения источника данных.) Кроме того, я настоятельно рекомендую использовать синтаксис реального соединения (ON) вместо использования предложения where и ваша жизнь станет намного проще, если вы будете использовать псевдонимы.

0 голосов
/ 30 января 2012
UPDATE `user`
SET credits=credits+0.25
WHERE userid IN (
    SELECT `user`.userid
    FROM `peers`, `user`
    WHERE `user`.userid = `peers`.uid
)

Это называется вложенный запрос , как вы правильно догадались. Фактически, единственная причина, по которой вам нужно объединение, заключается в том, что вы выбираете только записи, присутствующие в и user и peers таблицах (это неявное внутреннее объединение).

Если вы просто хотите обновить всех пользователей, независимо от того, находятся ли они в peers, вы можете сделать:

UPDATE `user` SET credits=credits+0.25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...