2011-01-28 13 views
13

ユーザーが特定のWebページを参照しているすべての時間を含む表があります。ユーザーはもちろん、複数回のページで見ることができるので、ユーザーやページに対して複数のエントリ、そのような存在になります私はすべてが見るすべてのページに対応する行を返すクエリをしたい列の最大値+グループ化に基づいてMySQLから行を選択する方法

nid  time user page_id 
25  8000  4  467 
24  7000  1  482 
23  6000  1  484 
22  5000  1  482 
21  4000  5  467 
20  3000  4  467 

ユーザーは、ユーザーがページを2回以上見た場合、最新のビュー(つまり、TIMEの最大値)に対応する行を取得します。このように、私はこれを取得する必要があります

nid  time user page_id 
25  8000  4  467 
24  7000  1  482 
23  6000  1  484 
21  4000  5  467 

をユーザ1が後の時点でのページ482を見て、ユーザ4が後でページ467を見ているので、我々は行20を失うので、我々は行22を失います。

私はほとんどこれを理解していますが、私はそれをかなりクラックさせることはできませんが、私が得ている結果は一般的に正しいと私のテストケースの事故だけではありません。私はGROUP BYまたはDISTINCTクエリと埋め込みクエリの間を行き来し続け、その後私の脳は爆発する。助言がありますか?ありがとう!

+0

重複質問 [のhttp://をstackoverflow.com/questions/612231/how-can-i-select-rows-with-maxcolumn-value-distinct-by-otherother-column-in-sql] – user1486030

答えて

19

をこのグループ内のこの列の値を返すことができます。したがって、グループ内のすべての値が同じでない場合、それはあなたのケースです。select句に直接含めることはできません。結合を使用する必要があります。

あなたはNIDフィールドを必要としない場合は、この他に使用することができますthe reference

にMySQLの列をグループ化されていない詳細を読むことができます:

SELECT MAX(time) as time, user, page_id 
    FROM TableName 
GROUP BY user, page_id 
ORDER BY time DESC 
+0

ええ、これは正しいことです。どうもありがとう!おそらく私はNIDフィールドが必要だと言及していたはずです。私はあなたの2番目のNID-lessの例になっていましたが、これは十分なものではありません。あなたの答えをマークアップし、それが答えが続くことを確認する。私は自分自身でこれを解決することは決してなかったことを正しく認識して5点を与えています... –

1

この試してみてください:あなたが句は、MySQL "によりグループ" の外に列を求める場合

SELECT fullTable.nid as nid, 
     recent.time as time, 
     fullTable.user as user, 
     fullTable.page_id as page_id 
    FROM TableName fullTable 
     INNER JOIN (SELECT MAX(t1.time) as time, t1.user, t1.page_id 
         FROM TableName t1 
        GROUP BY user, page_id) recent 
       ON recent.time = fullTable.time AND 
        recent.user = fullTable.user AND 
        recent.page_id = fullTable.page_id 
ORDER BY time DESC 

:あなたは完全な行が必要な場合は、これを使用することができます

SELECT * 
    FROM <YOUR_TABLE> 
WHERE (user, page_id, time) IN 
    (
    SELECT user, page_id, MAX(time) time 
     FROM <YOUR_TABLE> 
    GROUP BY user, page_id 
    ) 
0
SELECT nid, MAX(time), user, page_id 
FROM TableName 
GROUP BY nid, user, page_id 
関連する問題