0

visitmysql テーブル:

+---------+-------------+------------+--------+---------------------+
| visitId | visitSiteId | homeSiteId | userId |       time          |
+---------+-------------+------------+--------+---------------------+
|   1     |      1      |     1      |  1001  | 2013-09-01 11:50:12 |
|   2     |      1      |     1      |  1001  | 2013-09-03 12:50:12 |
|   3     |      2      |     1      |  1001  | 2013-09-04 13:50:12 |
|   4     |      2      |     1      |  1001  | 2013-09-07 11:00:00 |
|   5     |      2      |     1      |  1001  | 2013-09-09 12:32:12 |
|   6     |      2      |     1      |  1001  | 2013-09-13 15:48:12 |
|   7     |      2      |     2      |  1002  | 2013-09-01 11:00:12 |
|   8     |      2      |     2      |  1002  | 2013-09-02 12:50:12 |
|   9     |      2      |     2      |  1002  | 2013-09-05 13:50:12 |
|   10    |      1      |     2      |  1002  | 2013-09-06 11:50:12 |
|   11    |      1      |     2      |  1002  | 2013-09-07 12:50:12 |
|   12    |      2      |     2      |  1002  | 2013-09-15 13:50:12 |
+---------+-------------+------------+--------+---------------------+

訪問日時、訪問したサイト、およびユーザーのホーム サイトを記録します。

上記のデータから3つのレポートを出力する方法を見つけたいです。

  1. Non Home Site Visit Count >= HomeSite Visit Count を持つすべてのユーザーを返します。任意の日付
  2. 非ホーム サイト訪問回数 >= a 最小入力整数 (例: 非ホーム カウント >= 10) を持つすべてのユーザーを返します。
  3. 日付範囲の 1 と 2 の両方、つまり Time >= '2013-09-01 11:50:12' AND Time <= '2013-09-13 15:48:12'

私はMySQLに非常に慣れていないため、サブクエリ構文に苦労しているので、助けていただければ幸いです。以下のクエリは、自宅訪問と非自宅訪問の数を返しますが、サブクエリを組み合わせた結果を理解することはできません

SELECT COUNT(v.user_id), v.user_id FROM visit v WHERE v.Site <> v.HomeSite GROUP BY v.user_id;
SELECT COUNT(v.user_id), v.user_id FROM visit v WHERE v.Site = v.HomeSite GROUP BY v.user_id;
SELECT COUNT(v.user_id), v.user_id FROM visit v WHERE v.Site <> v.HomeSite AND v.Time >= '2013-09-01 11:50:12' AND v.Time <= '2013-09-13 15:48:12' GROUP BY v.user_id;
SELECT COUNT(v.user_id), v.user_id FROM visit v WHERE v.Site = v.HomeSite AND v.Time >= '2013-09-01 11:50:12' AND v.Time <= '2013-09-13 15:48:12' GROUP BY v.user_id;

以下は、テストを支援する MySQL の Create Table と INSERT Data です。

 CREATE TABLE `dbName`.`visit`(`visitId` INT(11) NOT NULL AUTO_INCREMENT, `visitSiteId` INT(11), `homeSiteId` INT(11), `userId` INT(11), `time` DATETIME, PRIMARY KEY (`visitId`));

INSERT INTO `dbName`.`visit`(`visitSiteId`,`homeSiteId`,`userId`,`time`) VALUES
  (1,1,1001,'2013-09-01 11:50:12'),
  (1,1,1001,'2013-09-03 12:50:12'),
  (2,1,1001,'2013-09-04 13:50:12'),
  (2,1,1001,'2013-09-07 11:00:00'),
  (2,1,1001,'2013-09-09 12:32:12'),
  (2,1,1001,'2013-09-13 15:48:12'),
  (2,1,1002,'2013-09-01 11:00:12'),
  (2,1,1002,'2013-09-02 12:50:12'),
  (2,1,1002,'2013-09-05 13:50:12'),
  (1,1,1002,'2013-09-06 11:50:12'),
  (1,1,1002,'2013-09-07 12:50:12'),
  (2,1,1002,'2013-09-15 13:50:12');
4

3 に答える 3

0

これは非常に簡単です。CASE ステートメントを使用して、ホーム サイトと非ホーム サイトの訪問を別々にカウントする必要があります。

クエリ 1

select userid
  from (
  select userid,
         count(case when visitsiteid = homesiteid then 1 end) homesitecount,   --count only those records where home site = visited site
         count(case when visitsiteid != homesiteid then 1 end) nonhomesitecount  --count only those records where home site != visited site
    from visit
   group by userid) as groupedvisit             --use this as inline view and filter out the users. 
 where nonhomesitecount >= homesitecount;

クエリ 2

select userid,
       count(case when visitsiteid != homesiteid then 1 end) nonhomesitecount
  from visit
 group by userid
having count(case when visitsiteid != homesiteid then 1 end) > 3; 

次のクエリはクエリ 1 と 2 に似ています。日付を制限するには、WHERE 句を追加する必要があります。

where time >= lower_limit and time <= upper_limit

sqlfiddleでのデモ

于 2013-10-01T04:26:04.193 に答える
0

更新:あなたが望むものを正しく理解していれば、このようにすることができます

1. 非ホーム サイトの訪問回数 >= ホーム サイトの訪問回数を持つすべてのユーザーを返します。任意の日付

SELECT userid, 
       SUM(visitsiteid <> homesiteid) visitsnonhome,
       SUM(visitsiteid = homesiteid) visitshome
  FROM visit
 GROUP BY userid
HAVING visitsnonhome >= visitshome;

2. 非ホーム サイト訪問回数 >= 最小入力整数を持つすべてのユーザーを返します。

SELECT userid, 
       SUM(visitsiteid <> homesiteid) visitsnonhome,
       SUM(visitsiteid = homesiteid) visitshome
  FROM visit
 GROUP BY userid
HAVING visitsnonhome >= 3;

3. 日付範囲のある 1 と 2 の両方...

WHERE上記のクエリに句を追加するだけです

SELECT userid, 
       SUM(visitsiteid <> homesiteid) visitsnonhome,
       SUM(visitsiteid = homesiteid) visitshome
  FROM visit
 WHERE time >= '2013-09-01 11:50:12' 
   AND time <= '2013-09-13 15:48:12'
 GROUP BY userid
HAVING visitsnonhome >= visitshome;

SELECT userid, 
       SUM(visitsiteid <> homesiteid) visitsnonhome,
       SUM(visitsiteid = homesiteid) visitshome
  FROM visit
 WHERE time >= '2013-09-01 11:50:12' 
   AND time <= '2013-09-13 15:48:12'
 GROUP BY userid
HAVING visitsnonhome >= 3;

これがSQLFiddleのデモです

于 2013-10-01T04:26:17.783 に答える