我有一个看起来像这样的表:
我想为每个id获取反馈中具有最大价值的行。所以我的预期结果应如下所示:
我试过这样做:
SELECT id, course_number, rate_average, max(feedbacks)
FROM [Table]
GROUP BY id;
我每个ID都获得一行,但该行不包含原始表中右行的数据。
哦,我正在使用mysql。
答案 0 :(得分: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和反馈,则会返回所有这些行。
答案 1 :(得分:0)
如果你想要每个id一行,那么想想"过滤",而不是"聚合"。一种方法是相关子查询:
select t.*
from t
where t.feedbacks = (select max(t2.feedbacks)
from t t2
where t2.id = t.id
);
注意:如果多行具有相同的最大值,那么这将返回id的所有行。如果这是一个问题,您可能应该提出另一个问题,并在这种情况下指定您想要返回的内容。
答案 2 :(得分: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;