1

投票とユーザーの2つのテーブルがあります。その日の総投票数の横に、日付ごとの新規登録ユーザーの総投票数(合計ではない)を表示したいと思います。

クエリの時間枠はすべてにすることができます。後で-から時間枠に追加できます。

したがって、日付Xごとに10票ある場合、新規ユーザーによって生成された場所とリピーターによって生成された数、および新規およびリピーターの数(*投票しなかった新規ユーザーも含む)を知りたいと思います。

投票:

id | vote | user_id | created_at
1  | 30   | 28      | 2012-06-10
1  | 12   | 15      | 2012-06-10
1  | 30   | 28      | 2012-06-10
...

ユーザー:

users_ id | created_at
28        | 2012-06-01
29        | 2012-06-03
30        | 2012-06-10
...

そして私が得ようとしている結果はこれです:

Date | total votes | votes for new | votes for returning | total new users | total returning users

ありがとう!

-----現在のコード:

        SELECT
      DATE(created_at) AS Date,
      SUM(CASE WHEN `Type` = 'Votes' THEN 1 ELSE 0 END) AS 'Total Votes',
      SUM(CASE WHEN `Type` = 'Users' THEN 1 ELSE 0 END) AS 'Total Users'
    FROM
    (
        SELECT created_at, 'Votes' `Type` FROM votes
        UNION ALL
        SELECT created_at, 'Users'        FROM users
    ) t
    GROUP by DATE(created_at)
    ORDER by DATE(created_at) DESC
4

1 に答える 1

0

これをいくつかのクエリに分割することを検討します。私があなたを正しく理解していれば、これはあなたが探しているものです。

すべての投票日:

SELECT created_at AS date, COUNT(*) AS totalvotes FROM votes GROUP BY created_at;

日付ごとの新規ユーザーによるすべての投票

SELECT v.created_at AS date, COUNT(*) AS newuservotes FROM votes v INNER JOIN users u WHERE v.user_id = u.user_id AND v.created_at = u.created_at GROUP BY v.created_at;

日付別の古いユーザーによるすべての投票

The two numbers subtracted

1 つのクエリですべてを取得する場合は、次のようにします。

SELECT totvotes.date AS date, totvotes.totalvotes AS totalvotes, IFNULL(newvotes.newuservotes, 0) AS newuservotes, totvotes.totalvotes-IFNULL(newvotes.newuservotes, 0) AS olduservotes
FROM 
(
SELECT created_at AS date, COUNT(*) AS totalvotes FROM votes GROUP BY created_at
) totvotes
LEFT JOIN
(
SELECT v.created_at AS date, COUNT(*) AS newuservotes FROM votes v INNER JOIN users u WHERE v.user_id = u.user_id AND v.created_at = u.created_at GROUP BY v.created_at
) newvotes ON totvotes.date = newvotes.date

mysql> select * from users; でテスト済み。

+---------+------------+
| user_id | created_at |
+---------+------------+
|       1 | 2012-06-01 |
|       2 | 2012-06-02 |
|       3 | 2012-06-03 |
+---------+------------+
3 rows in set (0.00 sec)

mysql> 投票から * を選択します。

+----+------+---------+------------+
| id | vote | user_id | created_at |
+----+------+---------+------------+
|  1 |   10 |       1 | 2012-06-01 |
|  2 |   20 |       1 | 2012-06-10 |
|  3 |   30 |       2 | 2012-06-02 |
|  4 |   40 |       2 | 2012-06-10 |
+----+------+---------+------------+
4 rows in set (0.00 sec)

結果:

+------------+------------+--------------+--------------+
| date       | totalvotes | newuservotes | olduservotes |
+------------+------------+--------------+--------------+
| 2012-06-01 |          1 |            1 |            0 |
| 2012-06-02 |          1 |            1 |            0 |
| 2012-06-10 |          2 |            0 |            2 |
+------------+------------+--------------+--------------+

同様のものは、「投票したことがない」ユーザーなどに使用できます

あなたが SQL にどれほど精通しているかわからなかったので、質問があればコメントしてください。回答を更新します。

于 2013-01-02T14:17:53.750 に答える