2013-08-02 246 views
2

我對sql不是很有經驗,但通常可以通過構造基本查詢來獲得,但這對我來說太複雜了。如何結合這兩個sql語句

我有兩個查詢,每個查詢都提供了我需要的結果,但是我需要將它們組合起來才能得到我需要的最終結果。

在一個查詢中,它爲特定學生抓取所有「分數」並返回平均值。在另一個查詢中,我從表格中除去最高和最低的記錄。

我想結合這些查詢來首先去除最高和最低的分數,然後從剩餘的記錄中返回平均分數。請幫助指導我使用正確的語法。

我的疑問:


這會將所有的最高分和最低分:

SELECT * 
FROM `scores` 
WHERE `tot_score` = (
SELECT MAX(`tot_score`) 
FROM `scores`) 
OR `tot_score` = (
SELECT MIN(`tot_score`) 
FROM `scores`) 

這將返回平均得分:

SELECT `pres_id`, COUNT(`pres_id`) , ROUND(AVG(`tot_score`) , 2) , `username`, `name`, `pres_day` 
FROM `scores`, `users` 
WHERE `users.id_user` = `scores.pres_id` 
GROUP BY `pres_id` 

我怎麼能結合這些來獲得我需要的結果?

+0

你是什麼意思的組合顯示一些樣本數據和所需的輸出? –

回答

5

我會建議你做最小的計算和最大值在一個子查詢中。然後,你可以簡單地認爲你想使用一個where子句可以過濾行:

SELECT s.`pres_id`, COUNT(`pres_id`), ROUND(AVG(`tot_score`) , 2) , 
     `username`, `name`, `pres_day` 
FROM `scores` s join 
    `users` u 
    on u.id_user = s.pres_id join 
    (select s.pres_id, max(tot_score) as maxts, min(tot_score) as mints 
     from scores s 
     group by s.pres_id 
    ) ssum 
    on u.id_user = ssum.pres_id 
where s.tot_score > ssum.mints and s.tot_score < ssum.maxts 
GROUP BY s.`pres_id`; 

我猜測你想要去除最高和最低分數爲每個學生。如果你只是想省略最高和最低所有學生,然後使用以下命令:

SELECT s.`pres_id`, COUNT(`pres_id`), ROUND(AVG(`tot_score`) , 2) , 
     `username`, `name`, `pres_day` 
FROM `scores` s join 
    `users` u 
    on u.id_user = s.pres_id cross join 
    (select max(tot_score) as maxts, min(tot_score) as mints 
     from scores s 
    ) ssum 
where s.tot_score > ssum.mints and s.tot_score < ssum.maxts 
GROUP BY s.`pres_id`; 

編輯:

修改,以保持得分時,只有一個分數的學生:

SELECT s.`pres_id`, COUNT(`pres_id`), ROUND(AVG(`tot_score`) , 2) , 
     `username`, `name`, `pres_day` 
FROM `scores` s join 
    `users` u 
    on u.id_user = s.pres_id join 
    (select s.pres_id, max(tot_score) as maxts, min(tot_score) as mints, 
      count(*) as cnt 
     from scores s 
     group by s.pres_id 
    ) ssum 
    on u.id_user = ssum.pres_id 
where (s.tot_score > ssum.mints and s.tot_score < ssum.maxts) or (cnt = 1) 
GROUP BY s.`pres_id`; 
+0

嗨,戈登,謝謝你的迴應。我注意到你的語法錯誤(交叉連接反向)。查詢運行時沒有錯誤,最初似乎返回我需要的結果,但我需要檢查一些記錄,看看它是否給了我期望的結果... – ace300

+0

是的,這是正確的。我想從每個學生分數中去除最大和最小分數(每個實例),並返回每個學生剩餘結果的平均值。當我嘗試運行第一個查詢時,它會返回一個「#1052 - 欄位列表pres_id'字段列表中含糊不清的錯誤」 – ace300

+0

@ user1734104。 。 。它需要別名來指定它來自哪個表。 –

3

你應該能夠反轉高/低成績查詢,然後把它作爲現有平均查詢的結果集:

SELECT `pres_id`, COUNT(`pres_id`) , ROUND(AVG(`tot_score`) , 2) , `username`, `name`, `pres_day` 
FROM (
    SELECT `tot_score` 
    FROM `scores` 
    WHERE `tot_score` <> (
    SELECT MAX(`tot_score`) 
    FROM `scores`) 
    OR `tot_score` <> (
    SELECT MIN(`tot_score`) 
    FROM `scores`) 
) AS `scores`, `users` 
WHERE `users.id_user` = `scores.pres_id` 
GROUP BY `pres_id` 
+0

謝謝你的建議。我運行了查詢,但它在'字段列表'中返回#1054 - 未知列'pres_id'。我也嘗試將SELECT更改爲'scores.pres_id',但仍然返回相同的錯誤「未知列」。有任何想法嗎? – ace300

+0

@ user1734104,然後只需更改內部查詢以選擇這些附加字段。 –