2010-04-26 4 views
0

В запросе MySQL как бы я выбираю:MySQL ORDER BY смещение

  • все строки, упорядоченные по колонке name
  • тех, кто name > 'f' должен прийти, а затем остальные в алфавитном порядке

так Я бы получил G, H, …, X, Y, Z, A, B, C …, F.

+0

Это домашнее задание? –

+1

нет - я 35 с детьми;) –

ответ

3
SELECT 
    * 
FROM 
    mytable 
ORDER BY 
    CASE WHEN name > 'F' THEN 0 ELSE 1 END, 
    name 
+0

Интересно ... Я не знал, что вы можете заказать функцию, которая не была столбцом результатов запроса. Я собирался с выбрать IF (name> = 'F', 0, 1) как PreSort и использовать THAT в качестве предложения OrderBy – DRapp

+0

Спасибо :) очень интересное решение –

+0

@ monk.e.boy: В MySQL результаты сравнения '0' и' 1'. Это означает, что вы * можете * избавиться от 'CASE' и сделать' ORDER BY name <'G', name', но я считаю, что это гораздо менее интуитивно (и несовместимо с другими диалектами SQL). – Tomalak

0

Может быть, я что-то не хватает, но это

SELECT * FROM mytable WHERE name > 'F' ORDER BY name 
+0

вы не получите все строки с этим. Мне нужны имена, начинающиеся с буквы A, следующего за Zs –

+0

А! Так что я * сделал * на самом деле пропустить что-то ... –

1

Вы можете сделать вид с 2 выбора запросов Query

SELECT * FROM mytable WHERE name > 'F' ORDER BY name 

и

SELECT * FROM mytable WHERE name < 'F' ORDER BY name 

и объединить результаты

+0

Маленькая ошибка: <= not <. Должно быть более простое решение с помощью UNION –

0

Я думаю, что он хочет, чтобы ответ, как

SELECT * FROM mytable WHERE name > 'F' ORDER BY SUBSTR (name, 1, 1) + 'G' 
+0

Я не могу заставить это работать Я получаю «FUNCTION anonymous_databse.SUBSTR» не существует ' –

+0

Извините - я просто сделал ленивый ввод, и это было предназначено как указатель на то, как вы можете это сделать. Я должен был сказать для Oracle, используйте ORDER BY ASCII ('G') + ASCII (SUBSTR (имя, 1,1)) – MJB

2

Использование MySQL, вы можете использовать этот сокращенный код:

SELECT * FROM tbl ORDER BY name > 'F' DESC, name 

G, H, I ... больше, чем F, так что выше условия приведут к истинным, истинным сортировкам последним, ложным сортировкам сначала, поэтому просто поместите DESC

+0

Спасибо, это работает –