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

それは機能しますが、私にはかなりばかげているように見えます...この1つのレコードを取得するためのよりエレガントな方法があるはずです。ここで提案されているアプローチを試しましたが、まだ機能させることができないので、助けていただければ幸いです。SQLの別の列でMAX(列値)、DISTINCTを使用して行を選択するにはどうすればよいですか。

この質問には2番目の部分があります。DISTINCT(いくつかの列)とMAX(別の列)で行をカウントします

4

2 に答える 2

2

結果から1行だけが必要です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 に答える