3

我的数据库中有以下表格:

names: 
id |   name   |
---|----------|
 1 |   Mark   |
 2 |   George |
 3 |   Liza   |
 4 |   Tai    |

evaluation
name_id |   score  |
--------|----------|
 1      |    30    |
 1      |    100   |
 2      |    20    |
 3      |    40    |
 3      |    50    |
 4      |    40    |
 4      |    50    |

bonuses
name_id |   bonus  |
--------|----------|
 1      |    5     |
 1      |    1     |
 1      |    60    |
 2      |    2     |
 2      |    8     |
 4      |    12    |
 4      |    50    |

当你看到每个名字都有一个或两个评价,以及许多(或没有)奖金时。

我需要 MYSQL 查询来获得最佳的evaluation.score 并将其与同一个人的所有 bonuses.bonus 相加,然后根据总和对名称进行排序。

我尝试了以下方法,但似乎我遗漏了一些东西:

SELECT 
    bonuses.name_id, 
    SUM(bonuses.bonus + evaluation.score) Total 
From bonuses, evaluation 
WHERE bonuses.name_id = evaluation.name_id 
group by names.id 
order by Total  

请帮我在我的查询中提及问题谢谢

4

5 回答 5

3

请查看此演示:

询问:

select n.id, n.name, 
(coalesce(max(e.score),0) +
coalesce(sum(distinct b.bonus),0)) as maxscorebonus
from name n
left join 
evaluation e
on n.id = e.name_id
left join 
bonuses b
on b.name_id = e.name_id
group by n.id
;

结果:

| ID |   NAME | MAXSCOREBONUS |
-------------------------------
|  1 |   Mark |           166 |
|  2 | George |            30 |
|  3 |   Liza |            50 |
|  4 |    Tai |           112 |
于 2013-01-13T19:50:41.900 回答
2

试试这个:

SELECT bonuses.name_id, SUM(bonuses.bonus + evaluation.score) Total 
FROM names, bonuses, evaluation 
WHERE bonuses.name_id = evaluation.name_id 
GROUP BY names.id 
ORDER BY Total

您在 FROM 语句中缺少该表names

于 2013-01-13T19:16:20.590 回答
1
SELECT 
    n.name as Name,
    IFNULL(SUM(e.score),0) + IFNULL(SUM(b.bonus),0) as Total
FROM names as n
LEFT JOIN evaluation as e ON n.id = e.name_id   
LEFT JOIN  bonuses as b ON b.name_id = e.name_id
GROUP BY n.id

SQL 小提琴演示

于 2013-01-13T19:30:35.830 回答
0
SELECT  n.id, 
        (
        SELECT  COALESCE(MAX(e.score), 0)
        FROM    evaluations e
        WHERE   e.name_id = n.id
        ) +
        (
        SELECT  COALESCE(SUM(b.bonus), 0)
        FROM    bonuses b
        WHERE   b.name_id = n.id
        ) AS total
FROM    names n
ORDER BY
        total
于 2013-01-13T19:32:24.820 回答
0

在这里,我加入names,bonuses来总结每个用户的所有奖金,并加入一个子查询,在其中计算每个用户的最高分数。然后我将最大值与奖金的总和相加:

select
  names.id,
  names.name,
  coalesce(max_score, 0) + coalesce(sum(bonus), 0) as total
from
  names left join bonuses
  on names.id=bonuses.name_id
  left join (
    select
      name_id,
      max(score) as max_score
    from evaluation
    group by name_id
  ) mx
  on names.id=mx.name_id
group by names.id,names.name
order by total desc

如果用户没有奖金或没有分数,则需要合并。

于 2013-01-13T21:48:09.610 回答