MySQL max选择最大值但与不正确的行配对

时间:2013-06-21 09:34:44

标签: mysql group-by max

我将首先向您展示我的数据库与一些示例数据的相似之处:

| 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的错误或对此方法有任何建议,我将非常感激。 (我有一种感觉,我的查询必须更加密集。)无论如何,谢谢。

5 个答案:

答案 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 ;