2012-05-31 6 views
0

У меня есть таблица вроде этого:INSERT INTO ... SELECT ... дублированием KEY

CREATE TABLE `UserTmp` (
`user_id` bigint(20) unsigned NOT NULL, 
`nb_invit` bigint(20) unsigned DEFAULT '0', 
`nb_share` bigint(20) unsigned DEFAULT '0', 
`nb_sent` bigint(20) unsigned DEFAULT '0', 
`total` bigint(20) unsigned DEFAULT '0', 
PRIMARY KEY (`user_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 

И я хочу, чтобы выполнить 3 запросов, как этот (по одному на стол, чтобы иметь nb_share, nb_invit и nb_sent):

INSERT INTO UserTmp (user_id, nb_share) 
    select user_id, count(share_date) as 'nb_share' 
    from Share 
    where share_date between '2012-05-21 00:00:00' and '2012-05-28 00:00:00' 
ON DUPLICATE KEY UPDATE nb_share=VALUES(nb_share); 

с nb_share поля равно числом доли curent пользователя, который существует в таблице, и требуется обновление

цель состоит в том, чтобы иметь список пользователей с ними номерами действия d полное поле, которое является суммой действий, выполняемых пользователем.

VALUES (nb_share) швов, чтобы дать мне общее количество nb_share для всех пользователей, а не для текущего пользователя.

У вас есть идея решить эту проблему?

Благодаря

ответ

3

Вы должны сгруппировать SELECT по user_id:

INSERT INTO UserTmp (user_id, nb_share) 
    SELECT user_id, count(share_date) 
    FROM  Share 
    WHERE share_date BETWEEN '2012-05-21 00:00:00' AND '2012-05-28 00:00:00' 
    GROUP BY user_id 
ON DUPLICATE KEY UPDATE nb_share = VALUES(nb_share) 
0

Или вы можете использовать пользовательскую переменную:

INSERT INTO UserTmp (user_id, nb_share) 
    SELECT user_id, @nbshare := count(share_date) 
    FROM  Share 
    WHERE share_date BETWEEN '2012-05-21 00:00:00' AND '2012-05-28 00:00:00' 
    GROUP BY user_id 
ON DUPLICATE KEY UPDATE nb_share = @nbshare 
Смежные вопросы