MYSQL根据性能获取用户排名

标签 mysql

我不是 MySQL 的专家,这一点在今天已被证明是显而易见的,但我需要帮助按销售额对用户进行排序。

我有两张 table 。一个叫用户

+------------------------+
+ id | fname | lname     +
+------------------------+
+  1 | bob   | french    +
+  2 | fred  | smith     +
+  3 | ted   | nugent    +
+  4 | kyle  | frank     +
+------------------------+

还有一个是销售

+------------------------------------------------------------+
+ id | date        | commission  | lister      | seller      +
+------------------------------------------------------------+
+  1 | 2017-11-01  | 2200        | 2           | 2           +
+  2 | 2018-01-15  | 1800        | 1           | 1           +
+  3 | 2017-11-07  | 3600        | 2           | 1           +
+  4 | 2017-11-30  | 1252        | 4           | 1           +
+------------------------------------------------------------+

佣金由发布者和卖家按 50/50 分配。 lister 和 seller 列对应于用户 id

我需要找到两件事。

A) 一个人(例如 Bob French)本月销售额的佣金总和排名

所以 Bob 应该拥有 50% 的销售额 #3 和 50% 的销售额 #4。

第 2 次促销事件不在本月

所以销售 #3 (1800) 的一半和销售 #3 (626) 的一半是 2426

这个月的排名应该是

  1. Fred @ 4000 总佣金
  2. Bob @ 2426 总佣金
  3. Kyle @ 626 总佣金
  4. Ted @ 0 总佣金

我需要返回本月(本例中为 11 月)USER(本例中为 bob)的 RANK(本例中为 2)和 TOTAL COMMISSION(本例中为 2426)

B) 我需要在不同的语句中显示整个上表(以便主管看到每个人的排名。用户只能匿名看到他们的排名。

两者可能是相同的 SQL 查询,然后我只是从结果集中按 id 提取用户,除非有更有效的方法。

我尝试过的

SELECT x.id, x.fname, x.lname, y.commission,
FIND_IN_SET( commission , ( 
    SELECT GROUP_CONCAT( commission ORDER BY commission DESC )
    FROM sales
) ) AS rank

FROM users x
JOIN sales y ON x.id IN (lister, seller)
ORDER BY rank ASC

这是可行的,但它不限于月份。我试过添加

WHERE (date between DATE_FORMAT(NOW() ,'%Y-%m-01') AND NOW() )

但它似乎没有效果,因为我尝试将日期限制在 2010 年,结果无论如何都回来了。

此外,上面的查询返回的是获得单一最高佣金的人的排名,而不是他们佣金的总和。

请帮忙。

最佳答案

您可以使用 UNION ALL :

select x.id, x.name, sum(commision) as commision from 
(select a.date as date, b.id as id, b.fname as name, a.commision/2 as commision
from sales a join users b
on a.lister = b.id
union all
select a.date as date, b.id as id, b.fname as name, a.commision/2 as commision
from sales a join users b
on a.seller = b.id) as x
where x.date between '2017-11-01' and '2017-11-30'
group by x.id, x.name

这里是 fiddle :http://sqlfiddle.com/#!9/8ae69a/7

对于您的过滤器 WHERE 和排序,您可以添加:

select x.id, x.name, sum(commision) as commision from 
(select a.date as date, b.id as id, b.fname as name, a.commision/2 as commision
from sales a join users b
on a.lister = b.id
union all
select a.date as date, b.id as id, b.fname as name, a.commision/2 as commision
from sales a join users b
on a.seller = b.id) as x
where (x.date between DATE_FORMAT(NOW() ,'%Y-%m-01') AND NOW() )
group by x.id, x.name
order by commision

- 编辑-

添加等级:( fiddle :http://sqlfiddle.com/#!9/8ae69a/30)

SET @rank = 0;

SELECT @rank := @rank + 1 AS rank,
       y.id,
       y.name,
       y.commision
FROM   (SELECT x.id,
               x.name,
               Sum(commision) AS commision
        FROM   (SELECT a.date          AS date,
                       b.id            AS id,
                       b.fname         AS name,
                       a.commision / 2 AS commision
                FROM   sales a
                       JOIN users b
                         ON a.lister = b.id
                UNION ALL
                SELECT a.date          AS date,
                       b.id            AS id,
                       b.fname         AS name,
                       a.commision / 2 AS commision
                FROM   sales a
                       JOIN users b
                         ON a.seller = b.id) AS x
        WHERE  ( x.date BETWEEN Date_format(Now(), '%Y-%m-01') AND Now() )
        GROUP  BY x.id,
                  x.name
        ORDER  BY x.commision) AS y  

关于MYSQL根据性能获取用户排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47193437/

相关文章:

mysql - 无法从同一网络内的 Spring Boot 容器通过主机名访问 mysql 容器

MySQL:使用 IN(@variable)更新表失败

php - 仅当 mysql/php 中的单元格未设置为 null 时才回显

python - datetime => timestamp 的差异仅在某些情况下?

mysql - 如何进行按不同产品分组的计数查询

java - 噩梦般的 java 泄漏...使用循环和 jdbc

javascript - 来自 mysql 的 json 编码返回 null

php - MySQL-IF 语句错误

mysql - 比特纳米。重置mysql根密码

mysql - 相当于MYSQL中的oracle函数DBMS_LOB.SUBSTRING