2013-10-04 46 views
1

我的(子)查询结果在下面的数据集:MySQL - 如何使用GROUP BY/ORDER BY和“嵌套”数据集?

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

请指教。

+0

你'GROUP BY item_id',但你没有在'version_id'或'relevance'上指定一个聚合,所以它们的值将被每个组随机选择一个桶。 – Nikhil

回答

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

+1

更改数据集后,我总结出您的解决方案正在运行,所以这太棒了! 我的子查询是相当昂贵的 - 没有多少行,但我不知道它是否会执行两次,我会回答下面的问题,向您展示解释输出。 –