2009-02-28 7 views
2

私は小さな問題があります。私は、SQLデータベースの結果を含む選択タグを設定しています。私が望むのは、最後のものがトップエントリとして追加され、残りがアルファベット順にソートされたものです。1以外のすべての結果をアルファベット順にソートするSQLクエリ?

だから、戻ってくる:

*----------*-------------* 
developerID|developerName 
*----------*-------------* 
| 40  | ZZZ Dev  | 
| 39  | A Dev  | 
| 38  | Be New Dev | 
*----------*-------------* 

を現在それだけで降順ですべてのエントリを選択します。

"SELECT developerName, developerID FROM developer ORDER BY developerID DESC" 

私は希望として使用可能な罰金が、されていません。

私は純粋なMySQLを使用して可能ですか?

答えて

9

(ある種のタイムスタンプ)開発者が追加されたときに定義する列がdeveloperAddedと仮定すると:

SELECT developerName, developerID, 1 AS ordering 
    FROM developer 
    WHERE developerAdded = (SELECT MAX(developerAdded) 
           FROM developer) 
UNION 
SELECT developerName, developerID, 2 AS ordering 
    FROM developer 
    WHERE developerAdded != (SELECT MAX(developerAdded) 
           FROM developer) 
ORDER BY ordering, developername; 

最後に追加された開発者(例えば最大developerID)を決定するためにいくつかの他の魔法の方法がある場合、調整それに応じてサブクエリ。

いくつかの開発者が '最近追加された'基準を満たしていても、このクエリは正常に機能します。彼らは長い間居た開発者の前にアルファベット順に表示されます。


最も最近追加された開発者は、最大developerIDを持っているので、改訂されたクエリは次のようになります。

SELECT developerName, developerID, 1 AS ordering 
    FROM developer 
    WHERE developerID = (SELECT MAX(developerID) FROM developer) 
UNION 
SELECT developerName, developerID, 2 AS ordering 
    FROM developer 
    WHERE developerID != (SELECT MAX(developerID) FROM developer) 
ORDER BY ordering, developername; 
+0

パーフェクト。最近追加された開発者は最大のdeveloperIDです。実際にそこに日付を格納する必要はありません。しかし、それは私が望んだものを正確に返します。 Jonathanに非常に感謝します。 :) – different

0
SELECT developerName, developerID 
    FROM developer 
    ORDER BY developerID = {last_used},developerID DESC 

またはその一部です。アイデアは2つの部分の並べ替えを行うことであり、最初の部分は最後の部分を引き出します。

- MarkusQ

編集には:あなたが一番上にそれをしたい「原因(ない追加)意味を逆転させました。

第2の編集では、あなたの質問の編集に対する最初の編集を元に戻しました。

+0

あなたの並べ替えはdeveloperIDの降順を示しています。その要求はアルファベットだったので、developerNameの昇順にする必要があります。 「製造された」列は答えの一部です。ブール値を使用していて、FALSEの前にTRUEオーダーを(おそらく正しく)仮定しています。 –

+0

私は彼が質問を編集し、そしてそれをあきらめたときに、これについていくつかの編集のフリルを行った。 MySQLではtrue == 1かつfalse == 0なので、このフォームの何かが彼が望むものを得るはずですが、詳細は彼が望むものに依存します。 – MarkusQ

+0

編集について心配する必要はありません。それは私が初期情報をあまりにも少なすぎると気付いただけです。ヒューマンエラー。 :) – different

2

私はこれを行うための最善の方法は、ちょうど2つのクエリであると思います。最新のアイテムをアルファベット順リストとは別に表示します。表示されるので、2度表示されます。これは簡単で、間違いなくより直感的で使いやすいものです。

そうしないと、実際にやりとりすることを強く求めている場合は、UNION ALLとINTERSECTまたはEXCEPTを使用して何かを調理することができます。しかし、MySQLはUNION(http://dev.mysql.com/doc/refman/5.1/en/union.htmlを参照)の結果に何らかの順序を保持していないので、そのようなクエリは醜いほど速くなる可能性があります。

+0

あなたはただMySQLの手を火につけて、注文を保存するだけです - 私の答えを見てください。 –

+0

そうできることができます。しかし、私はまだ別の解決策が簡単だと思っています。*と*とにかくより直感的な最終結果が得られます。行が2回表示されていることは大きな問題ではありません。特に、最新の行が何らかの方法で特別な行としてマークされている場合(それはそうであるため、それをマークする必要があります)。 – kquinn

+0

私は同意しなければならないでしょう。一度リストアップされるべきものは2度は大きな問題ですが、この場合は一般的ではないかもしれません。より直観的なのはあなたの直感にかかっています。私のものはあなたの意見に反するようです。 –

1

リスト内のアイテムのソート順を変更することをお勧めします。これは、ユーザーがリストに対して持つ「期待される動作」を変更するためです。

通常、そのページの最も一般的な使用が「最後に追加された」名前を扱う場合、そのリストで「デフォルト」の選択を行うことができます。したがって、ページが表示されたときに、最後に追加されたエントリがリストですでに選択されていますが、リストを開くと、すべてのエントリがアルファベット順に残り、期待通りに動作します。

あなたのクエリは単純なままですが、あなたは "使い勝手"の目標も達成します。

+0

それはいいアイデアだと思いました。しかし、これを使用している唯一のユーザーは自分です。 – different

+0

あなたのリストが一貫して一定の方法で提示されている場合、人々(自分だけ)はそこにあるものに慣れます。要求された順序でユーザーを望むことは、(共通の要件ではなく、完全に合理的な)ユーザーを欲することは、全く合理的です。 –

1

解決策の別の種類WHERE mainはタイムスタンプで、FIRSTアイテムを設定します。その他のものは、プレースのアルファベット順に並べ替えられます。

ORDER BY main=(SELECT MAX(main) FROM places WHERE user_ID = 7) DESC,place ASCSELECT ID,place,main FROM places WHERE user_ID = 7 
関連する問題