以下是我项目中的用户活动日志,每个项目都对各项进行了“投票”,每项都有“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
我需要添加什么才能达到目标?
答案 0 :(得分:1)
通常,您会使用order by
和LIMIT 1
的组合来获得最后一行。
在你的情况下,我会使用两个单独的查询。但我会首先重构我的数据库,以避免宗教和重复。强文
答案 1 :(得分:1)
基本上你只需要一个子查询,其中rec_id等于max rec_id
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
+-------+---------+----------+-------+
|rec_id | user_id | item_id | value |
+-------+---------+----------+-------+
| 6 | 1 | 2 | 1 |
| 7 | 1 | 4 | 2 |
+-------+---------+----------+-------+