簡體   English   中英

MySQL Group By 中的動態條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM