2017-01-23 64 views
1

的最大值行我有一個表,看起來像這樣:SQL:對於每一個COLUMN1發現它與列2

Table To SELECT from

我想每個ID是在反饋的最大值的行。所以我預期的結果應該是這樣的:

Wanted Result

我試着這樣做:

SELECT id, course_number, rate_average, max(feedbacks) 
FROM [Table] 
GROUP BY id; 

而且我得到每個ID一行但該行不包含原始表格中右列的數據。

哦,我正在使用mysql。

+1

MySQL或SQL服務器? – GurV

+0

@GurV我刪除了SQL Server標記 – Lamak

回答

2

試試這個:

select t.* 
from your_table t 
inner join (
    select 
     id, max(feedbacks) feedbacks 
    from your_table 
    group by id 
) t2 on t.id = t2.id and t.feedbacks = t2.feedbacks; 

它發現ID和最大的反饋,並與原表加入它來獲得相關的行。

請注意,如果有多個具有相同ID和反饋的行,則將返回所有這些行。

+0

這真棒,我想你已經解決了它。但是t2代表什麼? – yoni

+0

它是表的別名或在這種情況下子查詢。 – GurV

+0

太棒了。得到它了。有用。謝謝。 – yoni

0

如果你想每個ID一行,那麼認爲「過濾」,而不是「聚合」。一種方法是相關子查詢:

select t.* 
from t 
where t.feedbacks = (select max(t2.feedbacks) 
        from t t2 
        where t2.id = t.id 
        ); 

注意:如果多行具有相同的最大值,那麼這將返回所有行的ID。如果這是一個問題,你應該問另一個問題,並指定你想在這種情況下返回。

0

您也可以通過在id列的順序上按feedbacks列的降序添加行號組來實現此目的。

查詢

select t1.``id`, t1.`course_number`, t1.`rate_average`, t1.`feedbacks` from 
(
    select `id`, `course_number`, `rate_average`, `feedbacks`, 
    (
     case `id` when @curA 
     then @curRow := @curRow + 1 
     else @curRow := 1 and @curA := `id` end 
    ) as `rn` 
    from `your_table_name` t, 
    (select @curRow := 0, @curA := '') r 
    order by `id`, `feedbacks` desc 
)t1 
where t1.`rn` = 1;