2016-03-30 20 views
0

私はサブクエリimage_rankは、常に1で実行すると、MySQLの - グループ化されたデータから、結果のn個の数を取得

SELECT `img_url` 
    FROM 
    (SELECT img_url, 
        @image_rank := IF(@current_category = category_child, @country_rank + 1, 1) AS image_rank, 
        @current_category := category_child 
     FROM images 
     ORDER BY category_child, rand() 
    ) ranked 
    WHERE image_rank <= 5 

を私は記録することで、グループごとにランダムNの結果を取得しようとしていますし、クエリが動作していません1つのカテゴリに30以上のカテゴリがあります。

答えて

1

投稿内に@country_rank@image_rankである必要があります。また、user variablesの初期化はCROSS JOINに追加されています。

ランダムN選択を得るには、ORDER BY rand()image_rank世代の前でなければなりません。ここで

SELECT category_child, `img_url`, image_rank 
FROM 
(SELECT img_url, 
      @image_rank := IF(@current_category = category_child, @image_rank + 1, 1) AS image_rank, 
      @current_category := category_child AS category_child 
    FROM (SELECT * FROM images ORDER BY category_child, rand()) AS images_rand CROSS JOIN 
     (SELECT @image_rank := 0, @current_category := NULL) param 
) ranked 
WHERE image_rank <= 5; 

はデモです:

SQL:

-- data 
create table images(category_child int, img_url char(20)); 
insert into images values 
(1,'d'),(1,'c'),(1,'a'),(1,'b'),(1,'x'),(1,'s'), 
(2,'d'),(2,'c'),(2,'a'),(2,'b'),(2,'x'),(2,'s'); 
select * from images; 

-- Query wanted 
SELECT category_child, `img_url`, image_rank 
FROM 
(SELECT img_url, 
      @image_rank := IF(@current_category = category_child, @image_rank + 1, 1) AS image_rank, 
      @current_category := category_child AS category_child 
    FROM (SELECT * FROM images ORDER BY category_child, rand()) AS images_rand CROSS JOIN 
     (SELECT @image_rank := 0, @current_category := NULL) param 
) ranked 
WHERE image_rank <= 5; 

出力:

mysql> select * from images; 
+----------------+---------+ 
| category_child | img_url | 
+----------------+---------+ 
|    1 | d  | 
|    1 | c  | 
|    1 | a  | 
|    1 | b  | 
|    1 | x  | 
|    1 | s  | 
|    2 | d  | 
|    2 | c  | 
|    2 | a  | 
|    2 | b  | 
|    2 | x  | 
|    2 | s  | 
+----------------+---------+ 
12 rows in set (0.00 sec) 

mysql> -- Query wanted 
mysql> SELECT category_child, `img_url`, image_rank 
    -> FROM 
    -> (SELECT img_url, 
    ->   @image_rank := IF(@current_category = category_child, @image_rank + 1, 1) AS image_rank, 
    ->   @current_category := category_child AS category_child 
    -> FROM (SELECT * FROM images ORDER BY category_child, rand()) AS images_rand CROSS JOIN 
    ->  (SELECT @image_rank := 0, @current_category := NULL) param 
    -> ) ranked 
    -> WHERE image_rank <= 5; 
+----------------+---------+------------+ 
| category_child | img_url | image_rank | 
+----------------+---------+------------+ 
|    1 | s  |   1 | 
|    1 | x  |   2 | 
|    1 | b  |   3 | 
|    1 | c  |   4 | 
|    1 | d  |   5 | 
|    2 | b  |   1 | 
|    2 | s  |   2 | 
|    2 | x  |   3 | 
|    2 | c  |   4 | 
|    2 | a  |   5 | 
+----------------+---------+------------+ 
10 rows in set (0.00 sec) 

-- Run again and generate different rand selection 
mysql> SELECT category_child, `img_url`, image_rank 
    -> FROM 
    -> (SELECT img_url, 
    ->   @image_rank := IF(@current_category = category_child, @image_rank + 1, 1) AS image_rank, 
    ->   @current_category := category_child AS category_child 
    -> FROM (SELECT * FROM images ORDER BY category_child, rand()) AS images_rand CROSS JOIN 
    ->  (SELECT @image_rank := 0, @current_category := NULL) param 
    -> ) ranked 
    -> WHERE image_rank <= 5; 
+----------------+---------+------------+ 
| category_child | img_url | image_rank | 
+----------------+---------+------------+ 
|    1 | x  |   1 | 
|    1 | c  |   2 | 
|    1 | d  |   3 | 
|    1 | a  |   4 | 
|    1 | s  |   5 | 
|    2 | a  |   1 | 
|    2 | c  |   2 | 
|    2 | s  |   3 | 
|    2 | d  |   4 | 
|    2 | x  |   5 | 
+----------------+---------+------------+ 
10 rows in set (0.00 sec) 
+0

あなたの投稿では、country_rankはimage_rank - typoだったはずです。まだすべての結果のランクは、CROSS JOIN ... paramを追加した後の戻り値です。これはmysqlバージョンと関係がありますか? mysqlバージョン – usearch

+0

で編集しましたが、私は副選択に変更しました – usearch

0

MySQLで変数を使用している場合、あなたは一つの式と、使用中にそれらを設定しないでくださいそれらは別のものである。 MySQLは式の評価順序をselectで保証しません。したがって、変数の操作を単一の式に入れる必要があります。また、変数を初期化する必要があります:

SELECT `img_url` 
FROM (SELECT img_url, 
      (@image_rank := IF(@current_category = category_child, @image_rank + 1, 
           IF(@current_category := category_child, 1, 1) 
           ) 
      ) AS image_rank     
    FROM images i CROSS JOIN 
      (SELECT @current_category := '', @image_rank := 0) params 
    ORDER BY category_child, rand() 
    ) ranked 
WHERE image_rank <= 5; 
関連する問題