MySQL - 如何将GROUP BY / ORDER BY与“嵌套”数据集一起使用?

时间:2013-10-04 06:49:16

标签: mysql greatest-n-per-group

我的(子)查询导致以下数据集:

+---------+------------+-----------+
| 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)信息都会丢失。

请建议。

1 个答案:

答案 0 :(得分:1)

您可以这样做:

SELECT t1.item_id, max(t1.version_id), t1.relevance FROM t t1
LEFT JOIN t t2 ON t1.item_id = t2.item_id AND t1.relevance < t2.relevance
WHERE t2.relevance IS NULL
GROUP BY t1.item_id
ORDER BY t1.item_id, t1.version_id

输出:

| ITEM_ID | VERSION_ID | RELEVANCE |
|---------|------------|-----------|
|       1 |         16 |        30 |
|       2 |         18 |        22 |
|       3 |         13 |        31 |
|       4 |         14 |        19 |
|       5 |         17 |        49 |

小提琴here