2013-02-27 35 views
-1

比方說,我有:簡單加入,每組最多?

USERS: 
userid | name 
1  | John 
2  | Jack 

HITS: 
id | userid | time 
1 | 1  | 50 
2 | 1  | 51 
3 | 2  | 52 
4 | 1  | 53 
5 | 2  | 54 
6 | 2  | 55 

我怎樣才能得到每個用戶的前兩名命中。換句話說,修改此:

select 
    users.userid, 
    h.time 
from 
    users 
left outer join hits h 
on (users.userid = h.userid) 

得到這個:

array() { 
    [user 1] { 
    hit 1 => 50 
    hit 2 => 51 
    } 
    [user 2] { 
    hit 3 => 52 
    hit 5 => 54 
    } 
} 

我知道一個正常的連接會給我所有的東西,但是我怎樣才能將它限制爲只有2個點擊,從而有效地獲得每個用戶的兩個點擊量?

回答

2

嘗試此查詢 -

SELECT t.id, t.userid, t.time FROM (
    SELECT h1.*, COUNT(*) pos FROM hits h1 
    LEFT JOIN hits h2 
     ON h2.userid = h1.userid AND h2.time <= h1.time 
    GROUP BY 
    h1.userid, h1.time) t 
WHERE pos <= 2; 
0
SELECT a.userid, 
     a.name, 
     b.time 
FROM users a 
     INNER JOIN hits b 
      ON a.userid = b.userid 
WHERE 
    (
     SELECT COUNT(*) 
     FROM hits as c 
     WHERE b.userid = c.userid and 
       b.id >= c.id 
    ) <= 2; 
0

嘗試此查詢

SET @level = 0; 
SET @group = ''; 

SELECT 
* 
FROM (
    SELECT 
    time, 
    userid, 
    @level := IF(@group = userid, @level+1, 1) AS level, 
    @group := userid as UGroup 
    FROM hits 
    ORDER BY userid 
) rs 
WHERE level < 3 

Demo