MySQL选择问题,结果重复
假设我有一个名为questions的MySQL表,其布局和数据如下:MySQL选择问题,结果重复,mysql,grouping,Mysql,Grouping,假设我有一个名为questions的MySQL表,其布局和数据如下: id user_id answers created 1 1 35 <unix_timestamp> 2 1 30 <unix_timestamp> 3 1 25 <unix_timestamp> 4 2 20
id user_id answers created
1 1 35 <unix_timestamp>
2 1 30 <unix_timestamp>
3 1 25 <unix_timestamp>
4 2 20 <unix_timestamp>
5 2 15 <unix_timestamp>
6 3 10 <unix_timestamp>
7 4 9 <unix_timestamp>
8 5 8 <unix_timestamp>
9 6 7 <unix_timestamp>
10 7 6 <unix_timestamp>
它工作得很好,但在某些情况下,当某个非常受欢迎的用户向其追随者询问了很多问题并在两天内收到了答案时,此查询的结果仅来自一个或两个用户。现在我需要更改查询,以便每个用户只获得一个结果
换句话说,现在摆在桌面上的结果是:
id user_id answers created
1 1 35 <unix_timestamp>
2 1 30 <unix_timestamp>
3 1 25 <unix_timestamp>
4 2 20 <unix_timestamp>
5 2 15 <unix_timestamp>
我需要更改查询以获得以下结果:
id user_id answers created
1 1 35 <unix_timestamp>
4 2 20 <unix_timestamp>
6 3 10 <unix_timestamp>
7 4 9 <unix_timestamp>
8 5 8 <unix_timestamp>
我试过在网上找到的一些东西,但都不管用。我甚至不确定是否需要使用分组、联接、子查询或其他功能。我们可以使用Group by来获得每个用户的答案:
select id, user_id, answers from questions
where answers in (
select max(answers) as answers from questions
where `created` > UNIX_TIMESTAMP()-86400*2
group by user_id
);
order by answers desc
limit 5;
下面是模拟行号的用户变量示例
SELECT id, user_id, answers,created FROM (
SELECT
id, user_id, answers,created,
@rank:= IF(@user_id = user_id, @rank+ 1, 1) AS rank,
@user_id := user_id AS x
FROM t
ORDER BY user_id,answer DESC
) AS y WHERE rank <=1 ORDER BY id LIMIT 5
使用子选择筛选出每个用户的所有非最大答案:
select q.* from
questions q,
(select user_id, max(answers) max from questions group by user_id) r
where
q.user_id = r.user_id and
q.answers = r.max
order by q.answers desc limit 5;
看起来您正在询问有关如何创建一个非常相似的网站的堆栈溢出问题!不。这只是一个随机巧合:从上一个例子来看,PO似乎想要的是答案的最大值,而不是总和。这是如何回答问题的,其他专栏在哪里。是的,这不起作用。我需要答案最多的问题,而不是总和,我还需要id列。我已经编辑了我的答案。您能再次检查吗?如果点数的排列方式与id不同,则您的答案无效。请参阅反例:。最左边的一栏应该是3,4,6,而不是1,4,6。这一栏与右边的答案非常接近,谢谢,但我仍然得到了重复的答案。我不得不稍微修改一下这个查询,因为我需要按答案数降序排列结果,当一个用户先来,然后是另一个用户,然后第一个用户再问另一个问题时,我会得到重复的结果,@rank降为1,因为这只会是另一个用户。@AndrewK。经过编辑,用户可以连续排序。天哪,这真的很有效。这是正确的答案!我对性能不太确定,但目前看来效果不错。谢谢已找到解决方案,但也将尝试此方法,以查看性能。
select q.* from
questions q,
(select user_id, max(answers) max from questions group by user_id) r
where
q.user_id = r.user_id and
q.answers = r.max
order by q.answers desc limit 5;