[英]Dynamic condition in MySQL Group By
我有一張名為 viewlist 的表,如下所示
Id article_id viewdate
--------------------------------------------------
1 1 2015-07-01
2 1 2015-07-01
3 1 2015-07-01
4 2 2015-07-01
5 2 2015-07-01
6 1 2015-07-02
7 2 2015-07-02
8 1 2015-07-03
9 2 2015-07-03
10 1 2015-07-08
11 1 2015-07-08
我需要編寫一個 MySQL 查詢來通過對相鄰的 viewdate 字段進行分組來獲取計數和文章 ID
想要的結果如下
article_id count date_period
-----------------------------------------------------------------
1 4 2015-07-01 - 2015-07-02
2 3 2015-07-01 - 2015-07-02
1 3 2015-07-03 - 2015-07-08
2 1 2015-07-03 - 2015-07-08
有沒有簡單的查詢來獲得這種類型的結果?
我原來的解決方案顯然在變量初始化方面存在一些問題。
我猜下面修改后的解決方案可以解決這個問題。
它使用了一個小技巧,這可能會在未來版本的 MySQL(-type) 系統上失敗,但如果需要,很容易解決 - 只需將子查詢中的 HAVING 更改為超級查詢中的 WHERE 並在某處添加一個 ORDER BY。 ..
SELECT a.range_start
, a.range_end
, b.article_id
, COUNT(*) total
FROM
( SELECT x.viewdate range_start
, MIN(y.viewdate) range_end
, @i:=@i+1 i
FROM my_table x
JOIN my_table y
ON y.viewdate > x.viewdate
JOIN (SELECT @i:=0) vars
GROUP
BY range_start
HAVING MOD(i,2) = 1
) a
JOIN my_table b
ON b.viewdate BETWEEN a.range_start AND a.range_end
GROUP
BY article_id
, range_start;
http://www.sqlfiddle.com/#!9/d753f/3
針對下面的評論,類似以下內容可能是處理“未配對” range_starts 的一種方法 - 但它沒有經過測試......
SELECT a.range_start
, a.range_end
, b.article_id
, COUNT(b.article_id) total
FROM
( SELECT x.viewdate range_start
, COALESCE(MIN(y.viewdate),MAX(x.viewdate)) range_end
, @i:=@i+1 i
FROM my_table x
LEFT
JOIN my_table y
ON y.viewdate > x.viewdate
JOIN (SELECT @i:=0) vars
GROUP
BY range_start
HAVING MOD(i,2) = 1
) a
LEFT
JOIN my_table b
ON b.viewdate BETWEEN a.range_start AND a.range_end
GROUP
BY article_id
, range_start;
select article_id, count(article_id), concat(min(viewdate),' - ', max(viewdate)) from `tablename` group by article_id
試試這個它可能是工作。
以下查詢可能有用。 但我不確定這對於大型應用程序可能實用,也可能不實用
SELECT a.range_start
, a.range_end
, b.article_id
, COUNT(b.article_id) total
FROM
( SELECT x.viewdate range_start
, COALESCE(MIN(y.viewdate),MAX(x.viewdate)) range_end
, @i:=@i+1 i
FROM my_table x
LEFT
JOIN my_table y
ON y.viewdate > x.viewdate
JOIN (SELECT @i:=0) vars
GROUP
BY range_start
HAVING MOD(i,2) = 1
) a
LEFT
JOIN my_table b
ON b.viewdate BETWEEN a.range_start AND a.range_end
GROUP
BY article_id
, range_start;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.