1

table_a と table_b の 2 つのテーブルがあり、次のように作成および設定されています。

DROP TABLE IF EXISTS `table_a`;
CREATE TABLE `table_a` (
  `a_id` bigint(20) NOT NULL auto_increment,
  `user_name` varchar(255) default NULL,
  `created_at` datetime default NULL,
  `running_count` int default NULL,
  PRIMARY KEY  (`a_id`)
);

DROP TABLE IF EXISTS `table_b`;
CREATE TABLE `table_b` (
  `b_id` bigint(20) NOT NULL auto_increment,
  `user_name` varchar(255) default NULL,
  `start` datetime default NULL,
  `end` datetime default NULL,
  `total_count` int default NULL,
  PRIMARY KEY  (`b_id`)
);

insert into table_a values (NULL, '1', '2013-07-05 01:00:00', 1);
insert into table_a values (NULL, '1', '2013-07-05 02:00:00', 1);
insert into table_a values (NULL, '1', '2013-07-05 02:00:00', 1);
insert into table_a values (NULL, '1', '2013-07-05 03:00:00', 2);
insert into table_a values (NULL, '1', '2013-07-05 07:00:00', 1);
insert into table_a values (NULL, '1', '2013-07-05 08:00:00', 1);

insert into table_b values (NULL, '1', '2013-07-05 00:00:00', '2013-07-05 06:00:00', 0);
insert into table_b values (NULL, '1', '2013-07-05 06:00:01', '2013-07-05 12:00:00', 0);

次のクエリは、table_b を合計数で更新します。

update table_b b
set 
total_count= 
(
          SELECT  IFNULL(SUM(a.running_count),0) total_count
          FROM    table_a a
          where a.created_at BETWEEN b.start and b.end
          and a.user_name=b.user_name
          and a.created_at between '2013-07-05 00:00:00' and '2013-07-05 23:59:59'
);

結果は良好です。

+------+-----------+---------------------+---------------------+-------------+
| b_id | user_name | start               | end                 | total_count |
+------+-----------+---------------------+---------------------+-------------+
|    1 | 1         | 2013-07-05 00:00:00 | 2013-07-05 06:00:00 |           5 |
|    2 | 1         | 2013-07-05 06:00:01 | 2013-07-05 12:00:00 |           2 |
+------+-----------+---------------------+---------------------+-------------+

しかし、2013-07-05 02:00:00 に重複レコードがあり、2 ではなく 1 としてカウントされるため、最初のカウントを 5 ではなく 4 にする必要があります。

複数の重複したタイムスタンプがある場合、更新クエリを変更して 1 のみをカウントするにはどうすればよいですか?

4

1 に答える 1

1

交換:

FROM    table_a a

と:

FROM   (
       SELECT  DISTINCT created_at
       ,       user_name
       ,       running_count
       FROM    table_a
       ) a
于 2013-07-04T21:38:38.217 に答える