对于没有子查询的已知其他几列,为MAX(列)选择一行

时间:2013-01-20 22:52:11

标签: sql mysqli subquery

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

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)

2 个答案:

答案 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
       );