我有一个user_id
整数的列表N
,例如
[1001, 1023, 13452, 1679834, ...]
和一张表:
CREATE TABLE content (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user_id INT,
content VARCHAR(100),
score INT
);
我需要从N
获取user_id
个整数,并为每个user_id
获取具有最高content
的前3个score
。所以基本上我需要运行此查询N
次:
SELECT *
FROM content
WHERE user_id=1001
ORDER BY score DESC
LIMIT 3;
N
可能是一个非常大的数字。所以我非常希望避免逐个运行这些查询。
有没有办法减少我需要运行的查询数量?或许某种批量选择?
答案 0 :(得分:1)
这应该有效:
$str_ids = implode(', ', $arr_ids);
SELECT id, user_id, content, score
FROM ( SELECT *, (@rownum := @rownum + 1) AS rownum,
case when @user_id IS NULL then @user_id := c.user_id when @user_id != c.user_id then CONCAT(@rownum := 0, @user_id := c.user_id) AS dummy_value
FROM ( SELECT *
FROM content
WHERE user_id IN ({$str_ids})
ORDER BY user_id ASC, score DESC) AS c, (@rownum := 1, @user_id := NULL) AS vars
HAVING rownum <= 3
也许有更好的方法来做到这一点。如果是这样;让我知道!