我的表包含不同项目的用户投票。它包含以下字段:
id, user_id, item_id, vote, utc_time
我了解如何为 #item#获取 #user#的最后一次投票,但它使用子查询:
SELECT votes.*, items.name, items.price
FROM votes JOIN items ON items.id = votes.item_id
WHERE user_id = #user# AND item_id = #item#
AND utc_time = (
SELECT MAX(utc_time) FROM votes
WHERE user_id = #user# AND item_id = #item#
)
它有效,但它对我来说看起来很愚蠢...应该有一种更优雅的方式来获得这一条记录。我尝试了这里建议的方法,但我还不能使它工作,所以我很感激你的帮助:How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?
这个问题还有第二部分:Count rows with DISTINCT(several columns) and MAX(another column)
答案 0 :(得分:2)
您只需要结果中的一行,即MAX(utc_time)
的结果。在MySQL中,您可以使用LIMIT
来应用ORDER BY
子句:
SELECT votes.*, items.name, items.price
FROM votes JOIN items ON items.id = votes.item_id
WHERE user_id = #user# AND item_id = #item#
ORDER BY votes.utc_time DESC
LIMIT 1 ;
(user_id, item_id, utc_time)
或(item_id, user_id, utc_time)
上的索引有助于提高效率。
答案 1 :(得分:1)
简单:如果日期/时间是最大日期,则不会存在“更高”(更近期)的日期/时间(对于相同的{user,item})。
SELECT vo.*
, it.name, it.price
FROM votes vo
JOIN items it ON it.id = vo.item_id
WHERE vo.user_id = #user# AND vo.item_id = #item#
AND NOT EXISTS (
SELECT *
FROM votes nx
WHERE nx.user_id = vo.user_id
AND nx.item_id = vo.item_id
AND nx.utc_time > vo.utc_time
);