Only return an ordered subset of the rows from a joined table

爷,独闯天下 提交于 2019-12-12 04:18:02

问题


Given a structure like this in a MySQL database

#data_table
(id) | user_id | time | (...)

#relations_table
(id) | user_id | user_coach_id | (...)

we can select all data_table rows belonging to a certain user_coach_id (let's say 1) with

SELECT rel.`user_coach_id`, dat.*
FROM `relations_table` rel
LEFT JOIN `data_table` dat ON rel.`uid` = dat.`uid`
WHERE rel.`user_coach_id` = 1
ORDER BY val.`time` DESC

returning something like

| user_coach_id | id | user_id | time | data1 | data2 | ...
|             1 |  9 |       4 |   15 |   foo |   bar | ...
|             1 |  7 |       3 |   12 |   oof |   rab | ...
|             1 |  6 |       4 |   11 |   ofo |   abr | ...
|             1 |  4 |       4 |    5 |   foo |   bra | ...

(And so on. Of course time are not integers in reality but to keep it simple.)

But now I would like to query (ideally) only up to an arbitrary number of rows from data_table per distinct user_id but still have those ordered (i.e. newest first). Is that even possible?

I know I can use GROUP BY user_id to only return 1 row per user, but then the ordering doesn't work and it seems kind of unpredictable which row will be in the result. I guess it's doable with a subquery, but I haven't figured it out yet.


回答1:


To limit the number of rows in each GROUP is complicated. It is probably best done with an @variable to count, plus an outer query to throw out the rows beyond the limit.

My blog on Groupwise Max gives some hints of how to do such.



来源:https://stackoverflow.com/questions/34171176/only-return-an-ordered-subset-of-the-rows-from-a-joined-table

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!