我将首先向您展示我的数据库与一些示例数据的相似之处:
| 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做到这一点,但这不是我想要的。这只是一个测试):< / p>
SELECT *,MAX(date) from myTable
然而,这将返回列表中的第一行。所以我玩了一点,然后输入MAX(日期)为D,我发现它真的回到了第一列然后打了最高日期:
| id | type | id_user | date | D |
| 0 | 0 | 1 | 1 | 6 |
我尝试使用谷歌搜索并查看其他SO问题,但找不到任何可以解决问题的方法。如果有人知道我对MAX的错误或对此方法有任何建议,我将非常感激。 (我有一种感觉,我的查询必须更加密集。)无论如何,谢谢。
答案 0 :(得分: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)
答案 1 :(得分:0)
SELECT * FROM myTable WHERE date = (SELECT MAX(date) FROM myTable)
它给出了日期比另一个更大的所有记录。
无论如何,我不确定你的问题是什么。
答案 2 :(得分:0)
我对你的这部分问题感到有些困惑:
因此,如果我在哪里查询该组中有多少人,那么它将是3,因为用户1离开(2次)。
组中肯定有2个人,因为用户1在时间1加入,在时间3离开,在时间5加入然后最终在时间6离开?这将只留下用户2&amp;小组中的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;
答案 3 :(得分:0)
select count(*) as peopleingroup from(SELECT MOD(count(*), 2) as cnt FROM `tbl_name` group by `id_user`) as main where cnt=1
答案 4 :(得分:0)
您应该按组分组,但没有组字段。
SELECT sum( case when type = 0 then 1 else 0 end) -
sum( type) as count_group from myTable ;