2013-08-27 138 views
1

試想訂單以下MySQL表:訂購兩列

id | name 
1 | Mike 
2 | Steve 
3 | Janet 
4 | Juliet 
5 | Mike 
6 | Jane 

這是我當前的查詢:

SELECT * FROM table ORDER BY id DESC 

不過,我想「團」那些name,所以我有同一個人的訂單,但是,我不能做name

這是我想要的輸出:

id | name 
6 | Jane 
5 | Mike 
1 | Mike 
4 | Juliet 
3 | Janet 
2 | Steve 

什麼這個輸出的查詢?

+4

「我不能做ORDER BY名稱」。爲什麼不? – Nanne

+0

@Nanne:因爲我需要降序ID順序,除了名稱不明確之外。 –

+0

您確定需要在'sql'中執行此操作嗎? – Nanne

回答

3

例如爲:

SELECT y.id 
    , y.name 
    FROM my_table x 
    JOIN my_table y 
    ON y.name = x.name 
GROUP 
    BY name 
    , id 
ORDER 
    BY MAX(x.id) DESC 
    , id DESC; 
+0

'+ 1'。比我的好。 –

+0

優雅!謝謝! –

1

您可以通過雙ORDER BY做到這一點:

SELECT * FROM t ORDER BY name ASC, id DESC 
+0

這絕對不能解決眼前的問題。請再次閱讀該問題。 –

+0

@RichardRodriguez爲什麼不呢?它提供了正確的輸出(正如你所描述的那樣,至少:由於第一個ORDER條件,相似的名字將在一個'group'中,而'id'將由於第二個ORDER條件而下降。如果沒有,請澄清出了什麼問題。 –

+0

因爲它按名稱升序排列,而不是按id降序排列,因爲我的期望輸出是。 –

0
SELECT * FROM table1 
ORDER BY field(NAME,'Mike','Jane') desc, 
`ID` desc; 

exactly as you asked

+0

但是這需要他事先知道所有的名字,這似乎違反了直覺。 – EWit

+0

是的。在mysql中沒有方便的工具,而不是 –

-1

怎麼樣使用group by? 您可以按名稱對其進行分組,然後點擊...

2

您需要進行特殊計算以獲得其行位置。

SELECT a.* 
FROM tableName a 
     INNER JOIN 
     (
      SELECT Name, 
        @ord := @ord + 1 ord 
      FROM   
        (
         SELECT MAX(ID) ID, NAME 
         FROM TableName 
         GROUP BY Name 
        ) a, (SELECT @ord := 0) b 
      ORDER BY ID DESC 
     ) b ON a.Name = b.Name 
ORDER BY b.ord, a.ID DESC 
0

,如果你想擁有的東西是更通用的SQL你也可以試試這個查詢。

SELECT id, name 
FROM (SELECT id, name, (SELECT MAX(id) from Table1 where name=t.name) AS max_id 
    FROM Table1 AS t 
    ORDER BY max_id DESC, id DESC) as x