Mysql 按总计数的顺序选择行

Mysql 按总计数的顺序选择行,mysql,pdo,Mysql,Pdo,我有一个用户表,其中包含一个他们投票支持的用户id,如下所示: uid | voted_for 1 | 3 2 | 3 3 | 1 我的目标是根据有多少人投票支持uid来排序uid。但是我不知道怎么做 因此,最终结果将是: uid | Total_Votes 3 | 2 1 | 1 2 | 0 希望您能帮助解释为此构建SQL的最佳方法。也许类似的内容有助于将表本身连接起来: SELECT u.*, voted_for_cnt FRO

我有一个用户表,其中包含一个他们投票支持的用户id,如下所示:

uid | voted_for
 1  |   3
 2  |   3
 3  |   1
我的目标是根据有多少人投票支持uid来排序uid。但是我不知道怎么做

因此,最终结果将是:

uid | Total_Votes
 3  |     2
 1  |     1
 2  |     0

希望您能帮助解释为此构建SQL的最佳方法。

也许类似的内容有助于将表本身连接起来:

SELECT u.*, voted_for_cnt
FROM users u
   LEFT JOIN (
      SELECT voted_for, count(1) voted_for_cnt 
      FROM users
      GROUP BY voted_for
   ) t ON u.uid = t.voted_for
ORDER BY t.voted_for_cnt DESC

此简单查询将生成您请求的输出:

select voted_for as uid, count(*) as total_votes
from users
group by 1
order by 2 desc
如果希望输出中包含每个用户的所有数据,请将用户加入到自身:

select u.*, count(v.uid) as total_votes
from users u
left join users v on v.voted_for = u.uid
group by 1,2,3,4,5 -- put as many numbers here as there are columns in the users table
order by total_votes desc
如果没有人投票给该用户,则第二个查询的总投票分数为零

或者,您可以仅选择所需的列:

select u.uid, u.name, count(v.uid) as total_votes
from users u
left join users v on v.voted_for = u.uid
group by 1,2
order by 3 desc
```

要仅返还获奖者,请执行以下操作:

select u.uid, u.name, count(*) as total_votes
from users u
left join users v on v.voted_for = u.uid
group by 1,2
having count(*) = (
    select max(c) from (
        select count(*) as c from users group by voted_for))
order by 3 desc

是否可以有多行具有相同的uid-即myiple投票支持给定uid的值?一个用户只能投票支持一个人。所以uid是唯一的。那么总票数和总票数有何不同?在你的表格中有没有其他列你没有给我们看,比如你投的uid?@Bohemian看这里:我不明白你为什么需要一个小组。结果行是否与用户表中的行数相同,但顺序不同?太棒了,谢谢!感谢您向我介绍SQL fiddle:D@Dave-np,很高兴我能帮忙!啊,看,我尝试了你的第一种方法,只有拥有1票或更多票的用户。我有点被1,2,3,4,5这一组搞糊涂了,以前没见过-你能解释一下吗?你必须提到GROUPBY子句中的所有非聚合列。您可以通过名称/表达式或列位置来引用它们。假设未显示的用户表有以下列:uid、name、joined_date、age、voted_,然后按1,2,3,4,5分组相当于按uid、name、joined_date、age、voted_分组。按所需方式对组进行编码,只需确保选择u.*时在group by子句中提及用户的所有列,否则查询将无法正常工作,即使它不会出错,所以即使我的选择中没有使用的字段也必须包含在group by-SHIME中,没有简单的“全部”来表示xDI同意这是一个遗憾,你不能只说全部,但事实就是这样。您不必选择u.*-您可以只选择所需的列。我将为答案添加一个示例顺便说一下,由于某种原因,我得到了SQLSTATE[42000]:语法错误或访问冲突:1056无法在“total_votes”上分组,这是没有意义的,因为我的SQL group部分是按1,2,3,4,5,6分组的