2017-12-01 16 views
0

は、私は製品と並べ替え人気順、およびすべての5行に振りかけた新製品(5,10,15、...)を選択したいと思い、ここn行目ごとに混合結果を選択するにはどうすればよいですか?

product_id, popularity, date_add 

製品のテーブルを持っています。もう一度ページ2として選択することができます。出力は次のようになります。

popularity #1 
popularity #2 
popularity #3 
popularity #4 
latest #1 
popularity #5 
popularity #6 
popularity #7 
popularity #8 
latest #2 
popularity #9 
popularity #10 
popularity #11 
popularity #12 
latest #3 

どうすればいいですか?ありがとう!

+0

質問を編集して、これまでに試したことをお見せしてください。 –

+0

@SaucedApples Seriuosly、私はこの1つを試そうとは思わないでしょう。 – isaace

+0

あなたの人気声明から40の結果を得て、最新のテーブルから8つの結果を得て、それらが必要なところでコードに入れてください。もしあなたが本当にSQLでそれらを必要とするならば、 'SELECT * FROM foo LIMIT 10、 50 '、 'UNION ALL'を設定し、制限するパラメータを上げます。最新のテーブルに同じものを使用してください –

答えて

0

DDL:(ループやその他もろもろを使用して構築することは容易である)

create table Te (product_id int, popularity int, date_add int); 

insert into Te (product_id, popularity, date_add) 
values 
(1,  10,    1), 
(2,  21,    1), 
(3,  12,    1), 
(4,  23,    1), 
(5,  5,    1), 
(6,  2,    5), 
(7,  3,    6), 
(8,  1,    7), 
(9,  1,    1), 
(11,  210,   11), 
(12,  221,   11), 
(13,  212,   11), 
(14,  223,   11), 
(15,  25,    11), 
(16,  22,    15), 
(17,  23,    16), 
(18 ,  21,    27), 
(19,  21,    31); 

SQL

(select * from Te order by popularity desc LIMIT 5 OFFSET 0) 
UNION ALL 
(select * from Te order by date_add desc LIMIT 1 OFFSET 0) 
UNION ALL 

(select * from Te order by popularity desc LIMIT 5 OFFSET 5) 
UNION ALL 
(select * from Te order by date_add desc LIMIT 1 OFFSET 1) 
UNION ALL 

(select * from Te order by popularity desc LIMIT 5 OFFSET 10) 
UNION ALL 
(select * from Te order by date_add desc LIMIT 1 OFFSET 2) 
UNION ALL 

(select * from Te order by popularity desc LIMIT 5 OFFSET 15) 
UNION ALL 
(select * from Te order by date_add desc LIMIT 1 OFFSET 3) 

結果:あなたはで見るようにあなたが重複を持っています

product_id popularity date_add 

    14  223  11 
    12  221  11 
    13  212  11 
    11  210  11 
    15  25   11 
    *19  21   31 
    17  23   16 
    4   23   1 
    *16  22   15 
    *19  21   31 
    *2  21   1 
    18  21   27 
    *2  21   1 
    3   12   1 
    1   10   1 
    5   5   1 
    7   3   6 
    17  23   16 
    6   2   5 
    9   1   1 
    8   1   7 
    *16  22   15 

あなたはおそらくそれらをフィルタリングしたいと思っています....

0

自分の質問に回答を投稿する。

いいえ、まだ純粋なSQLではできませんでした。

これまで、「ソート」という名前の追加の列を追加することでこれを実行できました。この追加の列で、私が望むものをリストに振りかけることができます。クエリは簡単で高速です。

唯一の欠点は、ソート値を更新する余分な作業です。しかし、1時間程度でcrontabで簡単に行うことができます。

関連する問題