MySQL - 使用GROUP BY后返回最后一行

时间:2014-08-07 22:56:11

标签: mysql

以下是我项目中的用户活动日志,每个项目都对各项进行了“投票”,每项都有“1”,“2”或“3”评级。

rec_id | user_id | item_id  | value
-----------------------------------
1      | 1       | 2        | 3
2      | 1       | 2        | 2
3      | 2       | 1        | 1
4      | 3       | 1        | 1
5      | 3       | 2        | 2
6      | 1       | 2        | 1
7      | 1       | 4        | 2

我正在尝试返回所有item_id的user_id“1”已投票,以及他们为每个项目提供的最后一个值。所以,我的目标是从上面的完整表中返回以下行:

rec_id | user_id | item_id  | value
-----------------------------------
6      | 1       | 2        | 1
7      | 1       | 4        | 2

在第一个例子中,user_id“1”已经对item_id“2”投了三次,所以我想忽略用户1投票的先前实例。

这是我到目前为止的陈述,但是对于item_id 2的评级,它返回“3”,当它应该是“1”时:

SELECT MAX(rec_id), user_id, item_id, value 
FROM logs
WHERE user_id=1
GROUP BY user_id, item_id

我需要添加什么才能达到目标?

2 个答案:

答案 0 :(得分:1)

通常,您会使用order byLIMIT 1的组合来获得最后一行。

在你的情况下,我会使用两个单独的查询。但我会首先重构我的数据库,以避免宗教和重复。强文

答案 1 :(得分:1)

基本上你只需要一个子查询,其中rec_id等于max rec_id

QUERY:

SELECT 
    rec_id, user_id, item_id, value 
FROM logs
WHERE user_id = 1
  AND rec_id IN
  (   SELECT 
          MAX(rec_id) 
      FROM logs 
      GROUP BY item_id
  )
GROUP BY user_id, item_id

DEMO

输出:

+-------+---------+----------+-------+
|rec_id | user_id | item_id  | value |
+-------+---------+----------+-------+
| 6     | 1       | 2        | 1     |
| 7     | 1       | 4        | 2     |
+-------+---------+----------+-------+