MySQL: любой способ превратить эти N запросов в меньшее количество запросов? - PullRequest
0 голосов
/ 22 марта 2012

У меня есть список 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 получите верхний 3 content, который имеет самый высокий score.Поэтому в основном мне нужно выполнить этот запрос N раз:

SELECT *
FROM content
WHERE user_id=1001
ORDER BY score DESC
LIMIT 3;

N может быть очень большим числом.Поэтому я бы очень хотел избежать выполнения этих запросов один за другим.

Есть ли способ уменьшить количество запросов, которые мне нужно выполнить?Возможно, какой-то объемный выбор?

1 Ответ

1 голос
/ 22 марта 2012

Это должно работать:

$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

Может быть, есть лучший способ сделать это. Если такой; дай мне знать!

...