2013-06-21 111 views
1

配對,我會向您展示開始就是我的數據庫看起來像一些示例數據:MySQL的最大選擇最大值,但不正確的行

| id | type | id_user | date | 
| 0 | 0 | 1  | 1 | 
| 1 | 0 | 2  | 2 | 
| 2 | 1 | 1  | 3 | 
| 3 | 0 | 3  | 4 | 
| 4 | 0 | 1  | 5 | 
| 5 | 1 | 1  | 6 | 

這是什麼跟蹤,當人們離開或加入組,是我試圖弄清楚一個小組中有多少人。

例如,這檯曆史會是什麼樣子: (類型0 =加入,類型1 =葉子)

user 1 joins at time 1 
user 2 joins at time 2 
user 1 leaves at time 3 
user 3 joins at time 4 
user 1 joins at time 5 
user 1 leaves at time 6 

所以,如果我在哪裏可以查詢有多少人是該組中這將是2,因爲用戶1離開了2次,現在組中只有用戶2,3。

我一直在玩過去一個半小時,但似乎無法得到任何工作。我真的很困惑與MAX(),因爲它不返回我會認爲這是正確的結果(雖然我知道我在做什麼完全錯了)

SELECT *,MAX(date) from myTable GROUP BY id_user 

以上是我目前的想法,但其不給我任何我想要的東西。

我去了PHPMyAdmin並嘗試使用非常簡單的MAX()來獲取最大日期(我知道你可以通過ORDER BY date DESC做到這一點,但這不是我想要的,這只是一個測試):

SELECT *,MAX(date) from myTable 

但是,這將返回列表中的第一行。所以我打得周圍多一點,把在MAX(日期)爲d和我發現,它真的返回第一列,然後拍打在最高日期:

| id | type | id_user | date | D | 
| 0 | 0 | 1  | 1 | 6 | 

我試着用搜索引擎這個並查看了其他SO問題,但找不到解決我問題的任何問題。如果任何人有任何想法我在做什麼錯誤的MAX或有任何建議,對此方法我會很感激。 (我有一種感覺,我的疑問將會更加密集。)無論如何,謝謝。

+0

參見GROUPWISE max。如果您還在掙扎,請提供一個sqlfiddle以及所需的結果。 – Strawberry

回答

1

得到人們的組中的數最簡單的方法是:

select sum(case when type = 0 then 1 
       when type = 1 then -1 
      end) 
from myTable 

獲取的人的名單是有點更具挑戰性。你想要進入但還沒有離開的人。據推測,有人可以進入和離開多次。爲了解決這個問題,讓我們按照每人計算並使用以下邏輯:

select id_user 
from myTable 
group by id_user 
having sum(type = 0) > sum(type = 1) 
+0

這是一個這麼簡單的方法!我不知道爲什麼我不知道,如果這個人加入的比他們離開的多,那麼他們就在這個組裏。謝謝 – user2508385

0
SELECT * FROM myTable WHERE date = (SELECT MAX(date) FROM myTable) 

它給出了日期比另一個更大的所有記錄。

我不確定你的問題是否是這樣。

0

我有點糊塗了您的問題,這部分:

所以,如果我在哪裏可以查詢有多少人是該組中這將是3,因爲用戶1左(2次)。

當然,由於用戶1在時間1加入,在時間3離開,在時間5加入,最後在時間6離開,所以組中有2個人?這組中只留下用戶2 & 3 .....

反正 - 此查詢會給你的人的數量目前在羣:

select count(*) as peopleInGroup 
from 
(
select id_user, 
max(case when type = 0 then date else 0 end) as lastJoinDate, 
max(case when type = 1 then date else 0 end) as lastLeaveDate 
from groupLeave 
group by id_user 
) t 
where t.lastJoinDate > t.lastLeaveDate; 
+0

哇,你是對的,它會是2而不是3。那時我非常疲倦。無論如何,我測試了這一點,它確實有效。謝謝! – user2508385

0
select count(*) as peopleingroup from(SELECT MOD(count(*), 2) as cnt FROM `tbl_name` group by `id_user`) as main where cnt=1 
0

你應該有一個一組一組,但你沒有組字段。

SELECT sum(case when type = 0 then 1 else 0 end) - 
sum(type) as count_group from myTable ;