2016-09-08 2 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, то 2-го типа, то тип 1 и так далее):

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

У меня есть одно слайд-шоу, в котором я должен отображать изображения по типу. Среднее изображение первого типа с первого и второго изображений второго типа и т. Д. – 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


Объяснение:

Первый сорт результирующий набор на основе type и image.

Теперь присвойте номер строки каждой из отсортированных строк. Номер строки начинается с 1 каждый раз, когда обнаружен новый type, иначе он будет увеличен.

Таким образом, вы получите таблицу t.

Теперь, если вы просто закажете результаты на основе t.rowNumber, тогда вы получите первую строку каждого типа, затем вторую и так далее.

Выход:

Запуск выше запрос на данном входе образца вы получите выход, как показано ниже:

| id | image | type | 
|----|-------|------| 
| 1 | a.png | 1 | 
| 3 | c.png | 2 | 
| 2 | b.png | 1 | 
| 5 | e.png | 2 | 
| 4 | d.png | 1 | 
Смежные вопросы