0

次のようなテーブルがあります。

 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を持つためにテーブルごとに1つ):

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 フィールドは、テーブルに存在し、UPDATE を必要とする現在のユーザーの共有数に等しくなります

目標は、アクションの数と、ユーザーが実行したアクションの合計である合計フィールドを持つユーザーのリストを作成することです。

VALUES(nb_share) シームは、現在のユーザーではなく、すべてのユーザーによる nb_share の合計を私に提供します。

これを解決するアイデアはありますか?

ありがとう

4

2 に答える 2

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)
于 2012-05-31T08:55:45.457 に答える
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
于 2015-02-25T18:11:34.737 に答える