2017-02-14 7 views
2

私は、そのタイトルに基づいてデータベースから連絡先を取得するクエリを持っています。複数のタイトルを探し、同じクエリから複数の連絡先が返された場合は、特定の順序で連絡を取りたいと思います。ここで私が何を意味するかです:同じ列の複数の値による結果の並べ替え

SELECT * FROM tbl_contacts WHERE title IN ('General Manager', 'Owner', 'President') 

私が作ったクエリは、特定の中で結果を返すことができます方法:

id | name  | title    | email 
-----+-----------+--------------------+------------------ 
1 | Bob  | General Manager | [email protected] 
2 | John  | President   | [email protected] 
3 | Sue  | Owner    | [email protected] 

私のクエリは、このようなものです:

これは、テーブルの一例です注文(または私の場合はタイトルの階層)ですか?そのエンティティのためのゼネラルマネージャーがために、存在しない場合

  • 所有者
  • 社長
    1. ゼネラルマネージャー:

      は、私はいつもの順序であることの結果が欲しいですたとえば、私は同じ階層構造を保ちたいと思います。

      1. 所有者
      2. 社長
    +0

    を、私は知っているこれを行う方法はありません。あなたのDBデザインには、Display Order列が含まれている必要があります。 – Mark

    答えて

    3

    FIELD機能を使用します。指定された文字列のセット内の検索文字列の位置を返します。あなた自身のために設定し

    select * 
    from tbl_contacts 
    where title in ('General Manager', 'Owner', 'President') 
    order by field(title, 'General Manager', 'Owner', 'President') 
    
    +0

    これはそれです。本当にありがとう! – eeetee

    +0

    titleの項目の1つがNULLで、すべてのNULLレコードを選択したリストの最後に表示する場合はどうなりますか?私はフィールドで注文を使用しようとしましたが、私が何をしても、NULLが最初に来ています。 :-( – 300

    1

    あなたの場合は、単純なORDER BYはこれを行うことができます:

    SELECT * FROM tbl_contacts 
    WHERE title IN ('General Manager', 'Owner', 'President') 
    ORDER BY title ASC 
    

    別の方法タイトルがアルファベット順でない場合、あなたはFIELDを使用して、以下を使用することができます。

    SELECT * FROM tbl_contacts 
    WHERE title IN ('General Manager', 'Owner', 'President') 
    ORDER BY FIELD(title, 'General Manager', 'Owner', 'President') 
    
    +0

    これはIN節にある順番になりますか? – eeetee

    +0

    @eeeteeいいえ、アルファベット順です。 – Mark

    1

    :機能して、通常のASC/DESCのORDERの外

    SELECT * FROM tbl_contacts 
    WHERE title IN ('General Manager', 'Owner', 'President') 
    ORDER BY CASE 
           WHEN title = 'Owner' THEN 0 
           WHEN title = 'President' THEN 1 
           WHEN title = 'General Manager' THEN 2 
          END 
    
    関連する問題