2013-10-04 48 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

更改數據集後,我總結出您的解決方案正在運行,所以這太棒了! 我的子查詢是相當昂貴的 - 沒有多少行,但我不知道它是否會執行兩次,我會回答下面的問題,向您展示解釋輸出。 –