2016-09-08 9 views
0

で同時順序でデータをフェッチするために、私は以下のようなテーブルを持っている:どのようにMySQLの

id----image----type 
1-----a.png----1 
2-----b.png----1 
3-----c.png----2 
4-----d.png----1 
5-----e.png----2 

今私がオーダー以下のデータを取得したい(第一のタイプ1は、次に1を入力し、その上、その後2を入力):

1-----a.png----1 
3-----c.png----2 
2-----b.png----1 
5-----e.png----2 
4-----d.png----1 

どのように達成するには?

私はこれまで、クエリの下にあります

SELECT 
* 
FROM `table` 
WHERE (TYPE =1 OR TYPE =2) 
ORDER BY TYPE 
+1

はこの順序の背後にあるロジックものです。それとも、とにかくこの注文は正確に何ですか? – e4c5

+0

私はタイプごとに画像を表示する必要があるスライドショーを1つ持っています。タイプ1の最初のイメージ、タイプ2の2番目のイメージなどを意味します。 – DS9

答えて

2

例:

Select x.* from mytable x 
join mytable y on y.type =x.type and y.id <= x.id 
group by x.id 
order by count(*),x.type 

またはより高速な - と私は1000111で取得しようとしていた@何を考えて...

SELECT x.id 
    , x.image 
    , x.type 
    FROM 
     (SELECT a.* 
      , CASE WHEN @prev = type THEN @i:[email protected]+1 ELSE @i:=1 END rank 
      , @prev := type 
      FROM your_table a 
      , (SELECT @i:=0, @prev:=null) vars 
     ORDER 
      BY type 
      , id 
    ) x 
    ORDER 
    BY rank 
     , type; 

http://sqlfiddle.com/#!9/3e27c/8

1

私はあなたがMySQL user defined variables

SELECT 
t.id, 
t.image, 
t.type 
FROM 
(
    SELECT 
    id, 
    image, 
    type , 
    IF(@sameType = type, @rn := @rn + 1, 
     IF(@sameType := type, @rn := 1, @rn := 1) 
    ) AS rowNumber 
    FROM your_table 
    CROSS JOIN (SELECT @sameType := 0, @rn := 0) var 
    ORDER BY type , image 
) AS t 
ORDER BY t.rowNumber 

See Demo


説明の助けを借りてこれを実現することができますね。

まずtypeimageに基づいて結果セットを並べ替えます。

ここで、上記のソートされた行のそれぞれに行番号を割り当てます。行番号は新しいtypeが見つかるたびに1から始まり、それ以外の場合は増分されます。

この方法でテーブルtが得られます。

t.rowNumberに基づいて結果を並べ替えると、それぞれのタイプの最初の行が表示され、次に2番目の行などが表示されます。

出力:

あなたは以下のような出力が得られます与えられたサンプルの入力に上記のクエリを実行:

| id | image | type | 
|----|-------|------| 
| 1 | a.png | 1 | 
| 3 | c.png | 2 | 
| 2 | b.png | 1 | 
| 5 | e.png | 2 | 
| 4 | d.png | 1 | 
関連する問題