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    |

各名前には 1 つまたは 2 つの評価があり、多くの (またはまったくない) ボーナスがあります。

MYSQL クエリを使用して最高の評価を取得し、それを同じ人のすべてのボーナスと合計してから、合計に従って名前を並べ替える必要があります。

次のことを試しましたが、何かが足りないようです:

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

namesFROM ステートメントにテーブルがありませんでした。

于 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

ここでは、すべてのユーザーのすべてのボーナスを合計するために と結合namesbonuses、すべてのユーザーの最大スコアを計算するサブクエリと結合しています。次に、ボーナスの合計で最大値を合計します。

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 に答える
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 に答える