2013-08-27 5 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, так что у меня есть заказы от одного и того же человека, перечисленные друг за другом, однако я не могу сделать ЗАКАЗ BY name.

Это мой желаемый результат:

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

Что запрос на этот выход?

+4

«Я не могу сделать ЗАКАЗ BY BY». Почему нет? – Nanne

+0

@Nanne: Потому что мне нужен нисходящий порядок идентификаторов, за исключением случаев, когда имя не отличается. –

+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 почему бы и нет? Он обеспечивает правильный вывод (как вы описали, по крайней мере: похожие имена будут в одной «группе» из-за первого условия «ЗАКАЗАТЬ», а «id» будет убывать из-за второго условия «ЗАКАЗ»). Если нет, пожалуйста, уточните, что случилось. –

+0

Потому что он заказывает по имени по возрастанию, а не по убыванию имени, так как мой желаемый результат. –

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 
Смежные вопросы