2016-03-24 13 views
0

これまでに尋ねられているものの、探しているものがわからないのかどうかは不明です。だから、ここで問題です:MySQL、+ 1行おきに注文する

A DESC, C DESC, D ASC 

今望まれているものを持つことです。

MySQLのテーブルは

A, B, C, D 

A is 1 or 0 
B is 1 or 0 
C is 1, 2, 3 or 4 
D is a date 

はこれまでのところ、Bが無視されたとした「で順序が」フィールドが含まれています

A DESC, B "1 every other row else 0", C DESC, D ASC 

だから我々は、行が

0123のよう命じになるだろう
[A, 1, C, D] 
[A, 0, C, D] 
[A, 1, C, D] 
[A, 0, C, D] 
[A, 1, C, D] 
[A, 0, C, D] 
[A, 1, C, D] 
[A, 0, C, D] // last 0 
[A, 1, C, D] 
[A, 1, C, D] 
[A, 1, C, D] 

どのようにSQLでそれを行うのですか?この順序で行を選択することですので、SELECT ... ORDER BY ...

ありがとうございます!

必要
+0

CREATEと文を挿入し、対応する所望の結果適切な提供を検討。 – Strawberry

+0

どういう意味ですか?特定の順序でデータを選択することです。 –

+0

OK。それで幸運。 – Strawberry

答えて

0

order by

order by 
    A DESC, 
    IF(B = 1, 2*(@odd := @odd + 1), 2*(@even := @even + 1) + 1), 
    C DESC, 
    D ASC; 

次は、完全なデモです。

SQL:

-- data 
create table t1(A INT, B INT, C INT, D date); 
insert into t1 values 
(1,1,1,'2016-01-01'), 
(1,1,2,'2016-01-02'), 
(1,1,3,'2016-01-03'), 
(1,1,4,'2016-01-04'), 
(1,1,1,'2016-01-04'), 
(1,1,2,'2016-01-05'), 
(1,1,3,'2016-01-06'), 
(1,0,4,'2016-01-07'), 
(1,0,1,'2016-01-08'), 
(1,0,2,'2016-01-09'); 
select * from t1 order by A DESC, C DESC, D ASC; 

-- query wanted 
select t1.* 
from t1 CROSS JOIN (select @even := 0, @odd := 0) param 
order by 
    A DESC, 
    IF(B = 1, 2*(@odd := @odd + 1), 2*(@even := @even + 1) + 1), 
    C DESC, 
    D ASC; 

出力:

mysql> select * from t1 order by A DESC, C DESC, D ASC; 
+------+------+------+------------+ 
| A | B | C | D   | 
+------+------+------+------------+ 
| 1 | 1 | 4 | 2016-01-04 | 
| 1 | 0 | 4 | 2016-01-07 | 
| 1 | 1 | 3 | 2016-01-03 | 
| 1 | 1 | 3 | 2016-01-06 | 
| 1 | 1 | 2 | 2016-01-02 | 
| 1 | 1 | 2 | 2016-01-05 | 
| 1 | 0 | 2 | 2016-01-09 | 
| 1 | 1 | 1 | 2016-01-01 | 
| 1 | 1 | 1 | 2016-01-04 | 
| 1 | 0 | 1 | 2016-01-08 | 
+------+------+------+------------+ 
10 rows in set (0.00 sec) 

-- query wanted 
mysql> select t1.* 
    -> from t1 CROSS JOIN (select @even := 0, @odd := 0) param 
    -> order by 
    -> A DESC, 
    -> IF(B = 1, 2*(@odd := @odd + 1), 2*(@even := @even + 1) + 1), 
    -> C DESC, 
    -> D ASC; 
+------+------+------+------------+ 
| A | B | C | D   | 
+------+------+------+------------+ 
| 1 | 1 | 1 | 2016-01-01 | 
| 1 | 0 | 4 | 2016-01-07 | 
| 1 | 1 | 2 | 2016-01-02 | 
| 1 | 0 | 1 | 2016-01-08 | 
| 1 | 1 | 3 | 2016-01-03 | 
| 1 | 0 | 2 | 2016-01-09 | 
| 1 | 1 | 4 | 2016-01-04 | 
| 1 | 1 | 1 | 2016-01-04 | 
| 1 | 1 | 2 | 2016-01-05 | 
| 1 | 1 | 3 | 2016-01-06 | 
+------+------+------+------------+ 
10 rows in set (0.00 sec) 
+0

お返事ありがとうございました! –