我有这样的查询:
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多个连接)。
答案 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
中的解决方案