2015-11-04 59 views
-1

我有一個表的結構是這樣的:我如何解決這個ORDER BY在我的SQL?

ID NAME  SURNAME  EXTRA  TYPE 
______________________________________________ 

1  MARIO  ROSSI  RED   10 
2  MARCO  VERDI  YELLOW  10 
3  GIANNI BLU   TEACHER  20 
4  LUCA  BLU   STUDENT  20 
5  LUCA  ROSSI  GREEN  10 
6  MARIA  GIALLA  10/08/05  30 
7  MARTA  ROSA  11/01/79  30 
8  FRANCO NERO  BARMAN  20 
9  MARY  NERI  05/09/88  30 
10 MAX  BLU   06/08/98  30 

現在我需要按名字,姓氏查詢和(額外[DESC]其中type = 30),故有此第三的病情,我的意思是,我會安排所有額外的數據,其中類型是30降序:

.... 
6  MARIA  GIALLA  10/08/05  30 
10 MAX  BLU   06/08/98  30 
9  MARY  NERI  05/09/88  30 
7  MARTA  ROSA  11/01/79  30 
.... 

所以我已經試過這樣:

select * from my_table order by name, surname, if(my_table.type=30, extra desc, extra asc) 

,但它給了我一個SQL錯誤。

感謝您的支持。

感謝其他程序員,並根據我的數據,我以這種方式解決了:ORDER BY name,surname,if(TYPE = 30,STR_TO_DATE(EXTRA,'%d /%m /%Y%H。 %I'),NULL)DESC

+1

你介意分享你得到的確切錯誤嗎? – Olli

+0

另外,我不明白所需的結果集是如何符合要求的。你是否希望日期(即30型)的結果以日期降序存儲?如果是這樣,考慮將日期存儲爲恰當的日期數據類型(即yyyy/mm/dd) – Strawberry

+0

當名稱和姓氏的所有組合都是唯一的時候,按日期排序是相當不合理的。 – Strawberry

回答

0

它應該是這樣的:

SELECT * 
FROM Tabletest 
order by 
    CASE WHEN type <> 30 THEN 1 ELSE 2 END, 
    CASE WHEN type <> 30 THEN Name END, 
    CASE WHEN type <> 30 THEN Surname END, 
    CASE WHEN type = 30 THEN STR_TO_DATE(extra,'%m/%d/%Y') ELSE 0 END DESC 

這個訂貨會的結果爲:

enter image description here

+0

你能提供演示嗎? – Strawberry

+0

我該如何提供演示? –

+0

謝謝馬哈茂德,但這種解決方案也不能幫助我:EXTRA的順序是隨便的,不適用於decr日期:/ –

1

試試這個查詢: -

ORDER BY 
IF(type='30', extra, 0) DESC, 
IF(type !='30', extra, 0) ASC 
+0

感謝您的回覆,但此解決方案不起作用:/ –

+0

除了在額外之前需要名稱/姓氏之外,您還在跟蹤我的想法。 – DRapp

1

更有效,考慮以下因素:

DROP TABLE IF EXISTS my_table; 

    CREATE TABLE my_table 
    (ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
    ,NAME VARCHAR(12) NOT NULL  
    ,SURNAME VARCHAR(12) NOT NULL  
    ,EXTRA VARCHAR(12) NOT NULL  
    ,TYPE INT NOT NULL 
    ); 

    INSERT INTO my_table VALUES 
    (1,'MARIO','ROSSI','RED','10'), 
    (2,'MARCO','VERDI','YELLOW','10'), 
    (3,'GIANNI','BLU','TEACHER','20'), 
    (4,'LUCA','BLU','STUDENT','20'), 
    (5,'LUCA','ROSSI','GREEN','10'), 
    (6,'MARIA','GIALLA','2005/08/10','30'), 
    (7,'MARTA','ROSA','1979/01/11','30'), 
    (8,'FRANCO','NERO','BARMAN','20'), 
    (9,'MARY','NERI','1988/09/05','30'), 
    (10,'MAX','BLU','1998/08/06','30'), 
    (11,'MARIO','ROSSI','PLUMBER','20'), 
    (12,'MARCO','VERDI','TAILOR','20'), 
    (13,'GIANNI','BLU','YELLOW','10'), 
    (14,'LUCA','BLU','BLUE','10'), 
    (15,'LUCA','ROSSI','BAKER','20'), 
    (16,'MARIO','ROSSI','2004/08/10','30'), 
    (17,'MARCO','VERDI','1978/01/11','30'), 
    (18,'FRANCO','NERO','RED','10'), 
    (19,'FRANCO','NERO','1987/09/05','30'), 
    (20,'MARIA','GIALLA','1995/08/06','30'); 

    SELECT name 
     , surname 
     , MAX(CASE WHEN type = 10 THEN extra END) colour 
     , MAX(CASE WHEN type = 20 THEN extra END) occupation 
     , MAX(CASE WHEN type = 30 THEN extra END) date 
     FROM my_table 
    GROUP 
     BY name 
     , surname 
    ORDER 
     BY name 
     , surname 
     , extra 
     , type 
     , date DESC; 
+--------+---------+--------+------------+------------+ 
| name | surname | colour | occupation | date  | 
+--------+---------+--------+------------+------------+ 
| FRANCO | NERO | RED | BARMAN  | 1987/09/05 | 
| GIANNI | BLU  | YELLOW | TEACHER | NULL  | 
| LUCA | BLU  | BLUE | STUDENT | NULL  | 
| LUCA | ROSSI | GREEN | BAKER  | NULL  | 
| MARCO | VERDI | YELLOW | TAILOR  | 1978/01/11 | 
| MARIA | GIALLA | NULL | NULL  | 2005/08/10 | 
| MARIO | ROSSI | RED | PLUMBER | 2004/08/10 | 
| MARTA | ROSA | NULL | NULL  | 1979/01/11 | 
| MARY | NERI | NULL | NULL  | 1988/09/05 | 
| MAX | BLU  | NULL | NULL  | 1998/08/06 | 
+--------+---------+--------+------------+------------+ 

你可以加入這樣的結果(或實際上是一個更簡單的選擇 - 但我會用這根棍子現在)返回到原來的表格根據需要訂購結果。我已經添加了STR_TO_DATE函數,僅供參考。顯然這裏沒有必要,而且與你的版本需要的方式稍有不同...

SELECT x.* 
     , y.date 
    FROM my_table x 
    LEFT 
    JOIN 
     (SELECT name 
      , surname 
      , MAX(CASE WHEN type = 30 THEN extra END) date 
      FROM my_table 
     GROUP 
      BY name 
      , surname 
    ) y 
    ON y.name = x.name 
    AND y.surname = x.surname 
    ORDER 
    BY x.name 
     , x.surname 
     , STR_TO_DATE(y.date,'%Y/%m/%d') DESC; 

+----+--------+---------+------------+------+------------+ 
| ID | NAME | SURNAME | EXTRA  | TYPE | date  | 
+----+--------+---------+------------+------+------------+ 
| 18 | FRANCO | NERO | RED  | 10 | 1987/09/05 | 
| 19 | FRANCO | NERO | 1987/09/05 | 30 | 1987/09/05 | 
| 8 | FRANCO | NERO | BARMAN  | 20 | 1987/09/05 | 
| 13 | GIANNI | BLU  | YELLOW  | 10 | NULL  | 
| 3 | GIANNI | BLU  | TEACHER | 20 | NULL  | 
| 14 | LUCA | BLU  | BLUE  | 10 | NULL  | 
| 4 | LUCA | BLU  | STUDENT | 20 | NULL  | 
| 15 | LUCA | ROSSI | BAKER  | 20 | NULL  | 
| 5 | LUCA | ROSSI | GREEN  | 10 | NULL  | 
| 17 | MARCO | VERDI | 1978/01/11 | 30 | 1978/01/11 | 
| 2 | MARCO | VERDI | YELLOW  | 10 | 1978/01/11 | 
| 12 | MARCO | VERDI | TAILOR  | 20 | 1978/01/11 | 
| 6 | MARIA | GIALLA | 2005/08/10 | 30 | 2005/08/10 | 
| 20 | MARIA | GIALLA | 1995/08/06 | 30 | 2005/08/10 | 
| 11 | MARIO | ROSSI | PLUMBER | 20 | 2004/08/10 | 
| 16 | MARIO | ROSSI | 2004/08/10 | 30 | 2004/08/10 | 
| 1 | MARIO | ROSSI | RED  | 10 | 2004/08/10 | 
| 7 | MARTA | ROSA | 1979/01/11 | 30 | 1979/01/11 | 
| 9 | MARY | NERI | 1988/09/05 | 30 | 1988/09/05 | 
| 10 | MAX | BLU  | 1998/08/06 | 30 | 1998/08/06 | 
+----+--------+---------+------------+------+------------+ 
+0

謝謝,但問題是我有一個名爲「額外」的字段,其中包含日期,字符,整型ecc ....我需要添加在已經存在的條件(在ORDER BY中)的結尾:顯示我所有類型字段爲60的記錄(以DESC方式)(我們知道字段= 60是這種格式的日期10/05/2015 15.50)。非常感謝您的支持 –

+0

@FrancescoL。您可以將此結果加回到原始查詢中,以正確的方式訂購核心數據集。 – Strawberry

+0

我發現可能問題是我將字段EXTRA作爲TEXT(我無法更改此),因此,在此字段中有一個日期mysql將它視爲一個字符串,並且它將這些字符串排序。所以我需要在格式日期爲STR_TO_DATE之前轉換文本(本例中爲10/08/2015 13.45),然後我可以正確地進行轉換。對?或者有最簡單的方法來解決它? –