2017-08-08 11 views
1

私は次の表を持っていると一致する最初の行を選択し、順序:SQL:特定のIDと、特定の種類

id name type 
-- ---- ----- 
1 Joe H 
1 Zoe F 
2 Ken F 
2 Ben H 
3 Lime H 
4 Fine F 
5 Lima F 
5 Sima H 

私が最初に一致する行を選択したい:

id: 5 & type: H 

id: 2 & type: F 

id: 3 & type: H 

以降それらの残りはid ASCによって注文されました。

だから、最終的な結果は次のようになります。

id name type 
-- ---- ----- 
5 Sima H 
2 Ken F 
3 Lime H 
1 Joe H 
1 Zoe F 
2 Ben H 
4 Fine F 
5 Lima F 

私は複数の値によってソートされた最初の特定の行を表示する方法を見つけることができませんでした。私はPHPとMySqliを使用します。

おかげ

+0

、あなたにもちょうどすべての行を選択かもしれない、ととにかくそれらをすべて選択しているので、PHPで操作してください。 – user2914191

+0

PHPで行う方が簡単でしょうか? それを行う方法の例を教えてもらえますか? – Ido

答えて

1

あなたはcase文で注文することができます。これは、MySQLで行うには、痛みです

select * from table 
order by 
    case 
     when id = 5 and type = 'H' then 0 
     when id = 2 and type = 'F' then 1 
     when id = 3 and type = 'H' then 2 
     else 3 
    end, id, name 
+0

これはこれを行う最も簡単で最速の方法ですか? – Ido

+1

@Idoそれは私が知っている最も簡単な方法です、そしてそれは正しいです。特定の順序を得るために 'UNION'を使うことに注意してください。ほとんどの場合、正しい結果が得られますが、外側のクエリに 'ORDER BY'が含まれていないと実際には保証されません。 「個々のSELECT文でのORDER BYの使用は、UNIONがデフォルトで行の順序付けられていないセットを生成するため、行が最終結果に表示される順序については何も意味しません。 https://dev.mysql.com/doc/refman/5.7/en/union.html – FuzzyTree

+0

ありがとう!それはまた、大きなテーブルのための最速の方法ですよね? – Ido

0

はMySQLを求めたので、私はあなたのMySQLの答えを与えるでしょう。

SELECT * FROM 
(SELECT * FROM `table` WHERE id = 5 AND `type` = "H" ORDER BY id ASC) t 
    UNION 
(SELECT * FROM `table` WHERE id = 2 AND `type` = "F" ORDER BY id ASC) 
    UNION 
(SELECT * FROM `table` WHERE id = 3 AND `type` = "H" ORDER BY id ASC) 
    UNION 
(SELECT * FROM `table` ORDER BY id ASC); 

結果

+------+------+------+ 
| id | name | type | 
+------+------+------+ 
| 5 | Sima | H | 
| 2 | Ken | F | 
| 3 | Lime | H | 
| 1 | Joe | H | 
| 1 | Zoe | F | 
| 2 | Ben | H | 
| 4 | Fine | F | 
| 5 | Lima | F | 
+------+------+------+ 
8 rows in set (0.00 sec) 
+0

テーブル全体を検索するたびにFuzzyTreeの答えよりもかなり遅くなっていませんか? – Ido

+0

ええ。それはあなたがIDとタイプのインデックスを持っている場合は、毎回テーブル全体を検索しません。スピードが問題であると指定されていませんでした。私はそれが小さなデータセットだと思っていたので、最初はPHPを使うことを提案したのです。あなたが巨大なテーブルを持っているなら、あなたのクエリはあなたの記憶を食べるでしょう。 – user2914191

関連する問題