ホームページ > バックエンド開発 > PHPチュートリアル > このような要件を SQL で記述するにはどうすればよいでしょうか?

このような要件を SQL で記述するにはどうすればよいでしょうか?

WBOY
リリース: 2016-06-20 12:42:51
オリジナル
878 人が閲覧しました

ソートされた SQL
ステータス フィールドの逆順
ステータス = 1 の場合、時間フィールドは正の順序になり、ステータス = 0 の場合、時間フィールドは逆の順序になります

以下は、出力する必要がある結果です

id status time
5 1 50
6 1 51
1 0 99
10 0 1


ディスカッションへの返信 (解決策)

select * from (select * from 表 where status = 1 order by time)aunion allselect * from (select * from 表 where status = o order by time desc)b
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

選択* テーブルからステータスによる順序 desc,if(status=1, 'time asc','time desc');

時間による順序 (status = 1 の場合、desc else asc end)

select * from (select * from 表 where status = 1 order by time)aunion allselect * from (select * from 表 where status = o order by time desc)b
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー



いいえ、試してみました。順序を機能させるには、limit

select * from table order by status を続ける必要があります。 desc,if(status=1,'time asc',' time desc');


このような書き方をしてみましたが、このようにIfは使えません

試してみましたか?
どのデータベースを使用していますか?


select * from table order by status desc,if(status=1,'time asc','time desc');


この方法書き込みも試しましたが、このように使用できない場合は無効です

select * from tbl_name order by status=1 desc, time*if(status=1,1,-1)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここで、
time*if(status=1,1,-1) は status=0 の時間を変更します全体の昇順に適応するために負の数値に変換します
status=1 desc すべての status=1 を先頭に置きます

時間順に並べます (status = 1 の場合は desc、それ以外の場合は asc 終了)



このように書くとエラーが直接報告されます

順序に変更します (case when status = 1 then 'time desc' else 'time asc' end)
テストは次のようになります機能せず、ユニオン効果は

select * from tbl_name order by status=1 desc, time*if(status=1,1,-1)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

と同じです。ここで、
time*if(status=1,1,-1) は status=0 の時間を全体の昇順に適応する負の数
status=1 desc は、すべての status=1 を先頭に置きます

これはこのテーブルにのみ適用されます


order by time (case when status = 1 then desc else asc end)



このように書くと直接エラーが報告されます

order by (case when status = 1 then 'time desc) に変更されました' else 'time asc' end)
テストは機能しません、結果は Union と同じです

select * from table order by status=1 desc, status=0 asc シンプルで粗雑で実用的です


select * from tbl_name order by status=1 desc, time*if(status=1,1,-1)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このうち、
time*if(status=1,1,-1) は、status=0 の時間を負の数にして適応させます。
status=1 desc は、すべての status=1 を先頭に置きます。

これはこのテーブルにのみ適用されます



これは便利ですが、すべての IF クエリです。行を作成してから比較するのは少し非効率的ですが、後でさらにフィールドを作成し、計算後にこのフィールド desc
を押すことにしました。しかし、これでは柔軟性に欠けます。その他の特殊な並べ替えの場合は、フィールドを作成してから並べ替えフィールドを垂直に切り取る必要がある場合があります... (データ量が大きい場合)



order by time (case when status = 1 then desc else asc end)



このように書く エラーが直接報告されました

order by (case when status = 1 then 'time desc' else 'time asc' end)
テストは機能しません、効果は Union と同じです

select * from table order by status=1 desc, status=0 asc 简单粗暴实用


这句实现不了的...


select * from (select * from 表 where status = 1 order by time)aunion allselect * from (select * from 表 where status = o order by time desc)b
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー



不行的,我试过, order要起作用,后面必须要跟limit




你是什么数据库?
SELECT * FROM (SELECT * FROM `table2` WHERE `status`=1 ORDER BY time ASC) aUNION ALLSELECT * FROM (SELECT * FROM `table2` WHERE `status`=0 ORDER BY time DESC) b
ログイン後にコピー
ログイン後にコピー


我在mysql 5.6上运行是OK的



select * from (select * from 表 where status = 1 order by time)aunion allselect * from (select * from 表 where status = o order by time desc)b
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー



不行的,我试过, order要起作用,后面必须要跟limit




你是什么数据库?
SELECT * FROM (SELECT * FROM `table2` WHERE `status`=1 ORDER BY time ASC) aUNION ALLSELECT * FROM (SELECT * FROM `table2` WHERE `status`=0 ORDER BY time DESC) b
ログイン後にコピー
ログイン後にコピー


我在mysql 5.6上运行是OK的


mysql 5.5.24
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート