2017-03-16 49 views
0

我有這樣的查詢:是否可以限制WHERE col IN(...)語句中每個值的行數?

SELECT * FROM table WHERE user_id IN (val_1, val_2, ..., val_n) ORDER BY timestamp DESC LIMIT 15; 

正如我在以前的帖子已經探索有沒有辦法讓這個使用了排序的指標。

但是有沒有什麼辦法來限制MySql爲IN(...)語句中的每個值在臨時表中存儲的行數?

換句話說,告訴db獲取其中user_id = value_1的x行,然後從其中user_id = value_2的位置獲取x行,依此類推。

我需要限制這一點,因爲我不希望數據庫對太多的行進行排序,我只需要每個用戶的最新條目。

我已經解決了這個加入AND WHERE count <= m和我確保用戶的最近M個條目有一個數< = m,而這拖慢我係統項是由時,我不得不增加count M上-1個條目,並在最老的一個上將計數設置爲> m。

使用FULL JOIN不是一個選項。它做我想要的,但所有連接的執行速度非常慢(我需要50多個連接)。

回答

0

一種方法是蠻力:

SELECT * 
FROM table 
WHERE user_id = val_1 
ORDER BY timestamp DESC 
LIMIT 15 
UNION ALL 
SELECT * 
FROM table 
WHERE user_id = val_2 
ORDER BY timestamp DESC 
LIMIT 15 
UNION ALL 
. . . 

雖然這可能看起來「蠻力」,它可以在(user_id, timestamp)採取指數的優勢,所以它可能是有效的。

如果你想達到每個值「n」行,那麼變量可以幫助:

SELECT t.* 
FROM (SELECT t.*, 
      (@rn := if(@u = user_id, @rn + 1, 
         if(@u := user_id, 1, 1) 
         ) 
      ) as rn 
     FROM table t CROSS JOIN 
      (SELECT @rn := 0, @u := -1) params 
     ORDER BY user_id, timestamp DESC 
    ) t 
WHERE rn <= 15 
ORDER BY user_id, timestamp DESC; 
0

如果你需要每個用戶最新的條目,那麼你正在尋找一個GroupWise最大問題。查看MySQL手冊中的解決方案tutorial

相關問題