2012-08-28 74 views
1

我有以下MySQL查詢:選擇基於MySQL的SUM結果最高一行,關係

SELECT 
s.student_id, s.student_firstname, s.student_lastname, s.isActive, 
    c.city_name, 
    sd.student_startdate, sd.student_enddate, 
    SUM(scpe.scpe_estemated_days) AS total 
     FROM students s 
      INNER JOIN cityselections c ON c.city_id = s.student_city_id 
      INNER JOIN studentdates sd ON sd.student_id = s.student_id 
      LEFT JOIN studentcourseplan scp ON scp.student_id = s.student_id 
      LEFT JOIN studentcourseplanelements scpe ON scpe.scpe_cpl_id = scp.cpl_id 
       GROUP BY scp.cpl_id 

這可輸出:

+------------+-------------------+------------------+----------+------------+-------------------+-----------------+-------+ 
| student_id | student_firstname | student_lastname | isActive | city_name | student_startdate | student_enddate | total | 
+------------+-------------------+------------------+----------+------------+-------------------+-----------------+-------+ 
| 83   | John    | Doe    | 1  | Dallas  | 2012-07-23  | 2012-09-30  | 413 | 
| 84   | Derp    | Derpson   | 1  | Texas  | 2012-07-01  | 2012-08-26  | 413 | 
| 85   | Barack   | Obama   | 1  | Washington | 2012-08-02  | 2012-08-31  | 2  | 
| 85   | Barack   | Obama   | 1  | Washington | 2012-08-02  | 2012-08-31  | 153 | 
+------------+-------------------+------------------+----------+------------+-------------------+-----------------+-------+ 

現在我只想打印一行total列中的最高值爲student_id

我試過MySQLMAX()但我無法制作 這行得通。

應該怎麼做?

回答

0

嘗試使用此查詢...

SELECT A.student_id, A.student_firstname, A.student_lastname, A.isActive, 
    A.city_name, 
    A.student_startdate, A.student_enddate, 
    MAX(A.total) 
FROM (SELECT 
s.student_id, s.student_firstname, s.student_lastname, s.isActive, 
    c.city_name, 
    sd.student_startdate, sd.student_enddate, 
    SUM(scpe.scpe_estemated_days) AS total 
     FROM students s 
      INNER JOIN cityselections c ON c.city_id = s.student_city_id 
      INNER JOIN studentdates sd ON sd.student_id = s.student_id 
      LEFT JOIN studentcourseplan scp ON scp.student_id = s.student_id 
      LEFT JOIN studentcourseplanelements scpe ON scpe.scpe_cpl_id = scp.cpl_id 
       GROUP BY scp.cpl_id) AS A 
GROUP BY A.student_id; 

希望它可以幫助....

+0

完美!非常感謝你。 – David

+0

您查詢可能有效,但不正確。您不應該在選擇列表中包含未包含在「GROUP BY」子句中的屬性。 – Kermit

0

我會建議使用子查詢。

SELECT s.student_id, s.student_firstname, s.student_lastname, s.isActive, 
    c.city_name, sd.student_startdate, sd.student_enddate, 
    (SELECT SUM(scpe.scpe_estemated_days) 
     FROM studentcourseplan scp 
     LEFT JOIN studentcourseplanelements scpe ON scpe.scpe_cpl_id = scp.cpl_id 
     WHERE scp.student_id = s.student_id) AS scpe_estemated_days 
FROM students s 
INNER JOIN cityselections c ON c.city_id = s.student_city_id 
INNER JOIN studentdates sd ON sd.student_id = s.student_id; 

請參閱fiddle

我建議不要使用shubhansh的答案,因爲它選擇不包含在聚合中的屬性,這是不好的做法。

在標準的SQL,包括GROUP BY子句不能在沒有在 GROUP BY子句中命名的選擇列表請參考 到非聚合列的查詢。例如,這種查詢是標準的SQL非法 ,因爲在選擇列表中的名稱列不會在 GROUP出現BY:

SELECT o.custid, c.name, MAX(o.payment) 
    FROM orders AS o, customers AS c 
    WHERE o.custid = c.custid 
    GROUP BY o.custid; 

MySQL的擴展使用GROUP BY的,這樣的選擇列表可參考 未在GROUP BY子句中命名的非聚集列。這意味着 前面的查詢在MySQL中是合法的。

請參閱the manual