php - 仅使用一个查询的带有计数器的 MySQL 前 10 名列表

标签 php mysql count group-by sql-order-by

我实际上正在处理 Top10 邀请列表,显示邀请大多数其他用户的用户。

那是数据库表:

user_id  | name       | invited_by
-----------------------------------
1        | john       | 0
2        | maria      | 1
3        | johanna    | 1
4        | natasha    | 1
5        | julia      | 4
6        | antonio    | 4
7        | matthias   | 5
8        | daniel     | 5
9        | michelle   | 5
10       | anna       | 5

invited_by列中的数字(默认=0)等于邀请此人的user_id

所以我的前 10 个页面将显示:

TOP INVITERS:

  1. Julia (4 invites)
  2. John (3 invites)
  3. Natasha (2 invites)

等等……

我现在的问题是,我能否仅通过一个包含总邀请计数器的 mysql 查询来实现这一点,最终通过一个子查询来实现这一点,如果可以,那么该查询必须如何实现?

$sql = "SELECT * FROM table_users ...... LIMIT 10"

出于性能原因,使用这种表格样式和数百万用户,是否有机会挑选出尚未邀请某人的人,也许之前使用 in_array 检查?

最好的问候。

最佳答案

对自连接进行分组,然后对结果进行排序和限制:

SELECT   invitor.name, COUNT(*) AS invites
FROM     table_users invitor
    JOIN table_users invitee ON invitee.invited_by = invitor.user_id
GROUP BY invitor.user_id
ORDER BY invites DESC
LIMIT    10

关于php - 仅使用一个查询的带有计数器的 MySQL 前 10 名列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19574410/

相关文章:

MySQL:仅复制外键

mysql - 如何从多个值中添加总和

mysql - 如果客户在特定日期花费并返回,则 SQL 重复计数?

php - Ajax和Php表单数据保存到MS SQL表

javascript - 如何关闭 iframe 窗口?

PHP 握手失败 TLS1.0

MySQL - 在连接时引用伪表内的外部表

mysql - SQL (MySQL) 统计每个类(class)一个人的平均数

对穿过路径的代理进行计数

php - 使用 PHP 和 JavaScript 上传文件