2

我的表包含用户对不同项目的投票。它具有以下字段:

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#
            )

它有效,但对我来说看起来很愚蠢......应该有一种更优雅的方式来获得这张唱片。我尝试了这里建议的方法,但我还不能让它工作,所以我会很感激你的帮助:我如何选择具有 MAX(列值)的行,DISTINCT 由 SQL 中的另一列?

这个问题还有第二部分:Count rows with DISTINCT(several columns) and MAX(another column)

4

2 回答 2

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)将有利于效率。

于 2013-01-20T22:57:51.067 回答
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
       );
于 2013-01-20T23:08:56.250 回答