好,所以這裏有一些關於這個問題的東西,只是沒有道理......但是,你給這個工作的是我所做的。
FIRST:你的期望結果是完全不正確的..你說你想在它發生的那一天,但發佈一個完全不同的期望結果。我出去了一段時間,並假設你想要它,因爲這是要求,所以記住這是你會有的。
+-------------+---------+-----------+-----------+-----------+
|day occurred | aid | logins | searches | budget |
+-------------+---------+-----------+-----------+-----------+
|'2014-03-19' | 121 | 1 | 0 | 0 |
|'2014-03-20' | 123 | 0 | 0 | -1 |
|'2014-03-20' | 121 | 0 | 0 | 1 |
|'2014-03-21' | 121 | 0 | 2 | 0 |
|'2014-03-22' | 121 | 0 | 0 | 1 |
+-------------+---------+-----------+-----------+-----------+
這是來自您提供的數據......這是每個AID在每一天發生的事情。
SECOND: 考慮到這一點,您可以通過幾種方式實現此查詢。其中最好的是製作臨時表來完成設置,然後再進行簡單的查詢。
設置:
CREATE TABLE logs
(`id` int, `date` datetime, `aid` int, `t2_id` int, `message` varchar(55))
;
INSERT INTO logs
(`id`, `date`, `aid`, `t2_id`, `message`)
VALUES
(1, '2014-03-19 16:21:02', 121, 1, 'login from xxxx'),
(2, '2014-03-20 14:00:32', 123, 2, 'decrease budget'),
(3, '2014-03-20 18:00:32', 121, 2, 'increase budget'),
(4, '2014-03-21 16:21:02', 121, 3, 'login from xxxx'),
(5, '2014-03-21 16:21:02', 121, 3, 'login from xxxx'),
(6, '2014-03-22 10:21:02', 121, 2, 'increase budget')
;
CREATE TABLE log_type
(`id` int, `type` varchar(55))
;
INSERT INTO log_type
(`id`, `type`)
VALUES
(1, 'login'),
(2, 'change_budget'),
(3, 'search');
我叫表logs
,並log_type
因爲這是似乎在這裏發生。該表記錄的相互作用。
臨時表:
CREATE TEMPORARY TABLE t1
(
SELECT
l.aid,
DATE(date) AS grouping_col,
IF(
lt.type = 'change_budget',
IF(l.message LIKE '%decrease%', -1, 1),
0
) AS changed_budget
FROM logs l
JOIN log_type lt ON lt.id = l.t2_id
GROUP BY grouping_col, changed_budget, aid
);
CREATE TEMPORARY TABLE t2
( SELECT
DATE(l.date) AS grouping_col,
l.aid,
IF(lt.type = 'login', COUNT(l.id), 0) AS logged_in
FROM logs l
JOIN log_type lt ON lt.id = l.t2_id
GROUP BY grouping_col, aid
);
CREATE TEMPORARY TABLE t3
(
SELECT
DATE(l.date) AS grouping_col,
l.aid,
IF(lt.type = 'search', COUNT(l.id), 0) AS searched_for
FROM logs l
JOIN log_type lt ON lt.id = l.t2_id
GROUP BY grouping_col, aid
);
最終查詢:
最後,所有你需要做的就是查詢關閉這些臨時表來獲得您想要的結果
SELECT
t1.grouping_col as day_occurred,
t1.aid,
logged_in,
searched_for,
changed_budget
FROM t1
JOIN t2 on t2.grouping_col = t1.grouping_col AND t2.aid = t1.aid
JOIN t3 on t3.grouping_col = t1.grouping_col AND t3.aid = t1.aid
;
結果:
我在本地主機數據庫上設置了它並運行它,結果就是它應該是。 IMAGE
只寫代碼,你的想法... – user2963623
@ user2963623顯然,如果OP知道怎麼寫,他不會尋求幫助的代碼...... –
@ user2963623我的問題是我通常沒有那大數據。如果我以與小數據相同的方式對待它,我的內存是不夠的。所以我需要一個大數據解決方案。任何建議? – user3795071