0

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つを取得します。したがって、基本的にこのクエリ時間を実行する必要があります。contentscoreN

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

N非常に大きな数になる可能性があります。したがって、これらのクエリを1つずつ実行することは避けたいと思います。

実行する必要のあるクエリの数を減らす方法はありますか?ある種の一括選択はおそらく?

4

1 に答える 1

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

たぶん、これを行うためのより良い方法があります。そのような場合; お知らせ下さい!

于 2012-03-21T22:07:00.487 に答える