【发布时间】:2013-10-04 06:49:16
【问题描述】:
我的(子)查询产生以下数据集:
+---------+------------+-----------+
| item_id | version_id | relevance |
+---------+------------+-----------+
| 1 | 1 | 30 |
| 1 | 2 | 30 |
| 2 | 3 | 22 |
| 3 | 4 | 30 |
| 4 | 5 | 18 |
| 3 | 6 | 30 |
| 2 | 7 | 22 |
| 1 | 8 | 30 |
| 5 | 9 | 48 |
| 4 | 10 | 18 |
| 5 | 11 | 48 |
| 3 | 12 | 30 |
| 3 | 13 | 31 |
| 4 | 14 | 19 |
| 2 | 15 | 22 |
| 1 | 16 | 30 |
| 5 | 17 | 49 |
| 2 | 18 | 22 |
+---------+------------+-----------+
18 rows in set (0.00 sec)
项目和版本存储在单独的 InnoDB 表中。 两个表都有自动递增的主键。 版本具有项目的外键 (item_id)。
我的问题:如何根据相关性获得子集?
我想获取以下包含最相关版本的子集:
+---------+------------+-----------+
| item_id | version_id | relevance |
+---------+------------+-----------+
| 1 | 16 | 30 |
| 2 | 18 | 22 |
| 3 | 13 | 31 |
| 4 | 14 | 19 |
| 5 | 17 | 49 |
+---------+------------+-----------+
在相关性相同的情况下,获取 MAX(version_id) 会更理想。
我尝试了多种方式进行分组、加入、排序等,但我无法获得所需的结果。 我尝试过的一些事情是:
SELECT item_id, version_id, relevance
FROM (subquery) a
GROUP BY item_id
ORDER BY relevance DESC, version_id DESC
当然,排序发生在事实之后,因此相关性和 MAX(version_id) 信息都丢失了。
请指教。
【问题讨论】:
-
您
GROUP BY item_id但您没有在version_id或relevance上指定聚合,因此它们的值将在每个分组桶中随机选择。
标签: mysql greatest-n-per-group