2016-08-09 36 views
3

Ich möchte eine spezielle Sortierung für mysql Datenbanktabellen Datensätze machen, ich möchte sie in Abhängigkeit von der Farbe so erste Zeile rot, zweite Reihe grün, dritte Reihe rot, vierte Reihe grün, und so so dass ich möchte, dass sie alsMysql Spezielle Alternative Sortierung

sortiert werden

rot, grün, rot, grün, rot, ..

, wie dies erreicht werden kann mysql, um mit?

unterhalb einer MySQL-Tabelle zu Testzwecken:

CREATE TABLE `fav_color` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `color` enum('red','green') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'red', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ; 

INSERT INTO `fav_color` (`id`, `name`, `color`) VALUES 
    (1, 'test', 'red'), 
    (2, 'testing 33', 'red'), 
    (3, 'test 444', 'green'), 
    (4, 'test 555', 'red'), 
    (5, 'test 6666', 'green'), 
    (6, 'test 7777', 'red'), 
    (7, 'test 8888', 'red'), 
    (8, 'test 9999', 'red'), 
    (9, 'test 1000', 'green'), 
    (10, 'test 11111', 'green'), 
    (11, 'test 122222', 'green'), 
    (12, 'test 13333333', 'green'); 

Danke,

Antwort

1

Das ist schwierig. Eine Möglichkeit ist es, die Werte für jede Farbe aufzuzählen und dann Aggregat durch die Aufzählung:

select c.* 
from (select c.*, 
      (@rn := if(@c = color, @rn + 1, 
         if(@c := color, 1, 1) 
         ) 
      ) as rn 
     from fav_color c cross join 
      (select @c := '', @rn := 0) params 
     order by c.color, c.id 
    ) c 
order by rn, field(color, 'red', 'green'); 
2

Sie nach Farbe sortieren, Zeilennummern und cahnge, um für gerade und ungerade Zeilen erhalten:

select * from (
    select @rownum := @rownum + 1 AS rank, fav_color.* 
    from fav_color cross join (select @rownum := 0) t 
    order by color, id 
) t 
order by 
    -- Here @rownum is equal to count of records of subquery 
    (1 - rank % 2) * (@rownum + @rownum % 2 - rank + 1) + -- even 
    (rank % 2) * rank, -- odd 
    color 
0

Sie können nach Farbe sortieren, Zeilennummern und cahnge um für ungerade und gerade Zeilen erhalten: [Dank mnv]

set @rownum := 0; 
select * from (select @rownum := @rownum + 1 AS sort_col_fld, fav_color.* 
    from fav_color order by color, id) as tmp_table_alias 
order by 
    -- Here @rownum is equal to count of records of subquery 
    (1 - sort_col_fld % 2) * (@rownum + @rownum % 2 - sort_col_fld + 1) + -- Even 
    (sort_col_fld % 2) * sort_col_fld -- Odd 
    , color