是否可以在WHERE col IN(...)语句中限制每个值的行数?

时间:2017-03-16 10:36:03

标签: mysql

我有这样的查询:

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

正如我在之前的帖子中所探讨的那样,没有办法让这个用作订购的索引。

但有没有办法限制MySql存储在IN(...)语句中每个值的临时表中的行数?

换句话说,告诉db获取x行,其中user_id = value_1,然后是x行,其中user_id = value_2,依此类推。

我需要限制这个,因为我不希望数据库对太多行进行排序,而我只需要每个用户的最新条目。

我已经通过添加AND WHERE count <= m解决了这个问题,并且我确保用户的最新m个条目具有一个计数&lt; = m但是当我输入条目时这会减慢我的系统速度在m-1条目上增加count并将计数设置为&gt;我是最老的一个。

使用FULL JOIN不是一种选择。它做我想要的但是所有连接的执行非常慢(我需要50多个连接)。

2 个答案:

答案 0 :(得分: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
. . .

虽然这可能看起来像蛮力&#34;但它可以利用(user_id, timestamp)上的索引,因此它可能是有效的。

如果你想要&#34; n&#34;每个值的行,然后变量可以帮助:

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;

答案 1 :(得分:0)

如果您需要每个用户的最新条目,那么您正在查看GROUPWISE MAXIMUM问题。请参阅MySQL手册tutorial

中的解决方案