2016-09-30 129 views
2

我在解決如何編寫能夠爲使用HAVING和LIMIT子句的查詢創建摘要行的MySQL查詢有問題。下面是一些示例數據和這樣的重現我的問題..MySQL查詢使用HAVING和LIMIT子句創建查詢的摘要行

樣品表

CREATE TABLE `user` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `logins` int(10) unsigned DEFAULT NULL, 
    `date` date DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

樣本數據

INSERT INTO `user` (`id`, `logins`, `date`) 
VALUES 
    (1,1,'2016-09-25'), 
    (2,1,'2016-09-25'), 
    (3,2,'2016-09-26'), 
    (4,2,'2016-09-26'), 
    (5,3,'2016-09-27'), 
    (6,3,'2016-09-27'), 
    (7,4,'2016-09-28'), 
    (8,4,'2016-09-28'), 
    (9,5,'2016-09-29'), 
    (10,5,'2016-09-29'); 

這裏是顯示全結果我基本查詢。

mysql> select `date`, sum(`logins`) `logins` from `user` group by `date`; 
+------------+--------+ 
| date  | logins | 
+------------+--------+ 
| 2016-09-25 |  2 | 
| 2016-09-26 |  4 | 
| 2016-09-27 |  6 | 
| 2016-09-28 |  8 | 
| 2016-09-29 |  10 | 
+------------+--------+ 

沒問題得到摘要行關閉的,雖然權利..

mysql> select sum(`logins`) `logins` from `user`; 
+--------+ 
| logins | 
+--------+ 
|  30 | 
+--------+ 

但是,如果我想建立一個彙總行出來的東西像下面的查詢什麼?在這個例子中,我添加了HAVING和LIMIT子句來模擬非常大的數據集。此查詢中的HAVING子句表示用戶可以將其作爲接口中提供的過濾器中的最大金額進行更改。限制0,2表示結果的第1頁(在這種情況下爲3; 0,2; 2,4; 4,6)。這些查詢是分頁系統的一部分,用於一次顯示X,X數量的結果。因此,對於在查詢中的限制條款的原因..

mysql> select `date`, sum(`logins`) `logins` from `user` group by `date` having `logins` <= 8 limit 0, 2; 
+------------+--------+ 
| date  | logins | 
+------------+--------+ 
| 2016-09-25 |  2 | 
| 2016-09-26 |  4 | 
+------------+--------+ 

說我需要爲上述結果集應該總結出6名登錄在這種情況下,彙總查詢。我將如何去建立一個查詢來做這樣的事情?

現在我不能簡單地循環查詢結果(客戶端或服務器端)合計總計,因爲html表(服務器端生成)只顯示結果的第一頁,並且只會計數顯示在該特定頁面上的計數。我需要以顯示與完整的數據集跨表分頁的所有頁面,如果讓任何意義的計數摘要行..

UPDATE

這是一種理想的結果的樣本..

+------------+--------+ 
| date  | logins | 
+------------+--------+ 
| 2016-09-25 |  2 | 
| 2016-09-26 |  4 | 
+------------+--------+ 
| TOTAL  |  20 | <-- JUST NEED A QUERY TO PRODUCE THIS NUMBER SOME HOW.. 
+------------+--------+ 

對不起你們。我的意思是說20應該是多少,而不是6 ..監守完整結果和HAVING過濾器設置會這樣:

mysql> select `date`, sum(`logins`) `logins` from `user` group by `date` having `logins` <= 8; 
+------------+--------+ 
| date  | logins | 
+------------+--------+ 
| 2016-09-25 |  2 | 
| 2016-09-26 |  4 | 
| 2016-09-27 |  6 | 
| 2016-09-28 |  8 | 
+------------+--------+ 

SORRY!

這幾乎就像我需要像這樣的查詢(沒有GROUP BY):

select `date`, sum(`logins`) `logins` from `user` having `logins` <= 8 

但顯然這並不工作..

最後更新

那麼這裏是我20基於客@低於陰影的回答是一個很簡單的例子,但最終導致我我所需要的答案:

mysql> select sum(`logins`) `logins` from (select `date`, sum(`logins`) `logins` from `user` group by `date` having `logins` <= 8) t; 
+--------+ 
| logins | 
+--------+ 
|  20 | 
+--------+ 
+0

看起來很像你想要的東西!你能顯示所需的輸出 – e4c5

+0

我需要一個查詢來顯示6登錄爲最後一次查詢的摘要行。 – Rick

回答

2

你需要做後的總結有和限制條款適用。當你顯示數字時你可以在表示層做這些事情,或者你必須在sql中有第二個查詢作爲子查詢,並且在外部查詢中完成總和。

select sum(logins) as logins from 
    (select `date`, sum(`logins`) `logins` from `user` group by `date` having `logins` <= 8 limit 0, 2) t 
+0

嘿,現在..這可能正是我要找的!我刪除了限制,並得到我需要的(20)。要嘗試一下,看看。 – Rick

+0

嗯,我得到它正常工作基於這個答案,所以非常感謝你@Shadow! – Rick

0

可以使用CROSS JOIN包括總結果查詢:

select u.`date`, 
     sum(u.`logins`) `logins`, 
     t.`total_logins` 
from `user` as u 
cross join (select sum(`logins`) `total_logins` from `user`) as t 
group by u.`date` 
having `logins` <= 8 limit 0, 2; 

Demo here

編輯:

您可以使用稍微更復雜的查詢之下,以得到期望的結果:

select `date`, `logins` 
from (
    select `date`, `logins`, @rn := @rn + 1 as rn 
    from (
    select case when `date` is null then 'Total' else `date` end as `date`, 
      sum(`logins`) as `logins` 
    from (
     select `date`, sum(`logins`) `logins` 
     from `user` 
     group by `date` 
     having `logins` <= 8) as t 
    group by `date` with rollup) as s 
    cross join (select @rn := 0) as v  
    order by case when `date` = 'Total' then 1 else 0 end, 
      `date`) as x 
where x.rn <= 2 or x.`date` = 'Total' 

Demo here

+0

雖然在上面的最後一個查詢的結果中只有6個..這個查詢給了我30 .. – Rick

+0

@Rick你說:*我需要顯示一個帶有完整數據集計數的彙總行*所以你需要顯示*總數*行數? –

+0

「在這種情況下,我需要上述結果集的摘要查詢應該合計6個登錄名,我該如何構建一個查詢來執行此類操作?」 – Shadow