1

我将首先通过一些示例数据向您展示我的数据库的外观:

| 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  |

这是跟踪什么时候人们离开或加入组,我试图让有多少人在一个组中。

例如,这个表的历史看起来像:(type 0 = joins, type 1 = Leaves)

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(date) 作为 D,我发现它实际上是返回第一列,然后在最高日期上拍打:

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

我试过用谷歌搜索这个并查看了其他 SO 问题,但找不到任何可以解决我问题的东西。如果有人知道我在 MAX 上做错了什么,或者对解决方法有任何建议,我将不胜感激。(我觉得我的查询必须更加密集。)无论如何,谢谢。

4

5 回答 5

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)
于 2013-06-21T14:14:47.410 回答
0

你应该有一个组,但你没有组字段。

SELECT sum( case when type = 0 then 1 else 0 end) - 
sum( type) as count_group from myTable ;
于 2013-06-21T11:41:45.607 回答
0
SELECT * FROM myTable WHERE date = (SELECT MAX(date) FROM myTable)

它给出了日期大于另一个的所有记录。

我不确定你的问题是这样的。

于 2013-06-21T09:56:04.290 回答
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;
于 2013-06-21T10:07:23.343 回答
0
select count(*) as peopleingroup from(SELECT MOD(count(*), 2) as  cnt FROM `tbl_name` group by `id_user`) as main where cnt=1
于 2013-06-21T10:08:36.180 回答