2013-06-21 91 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 ;