MySQL - ORDER BY values within IN()

前端 未结 6 1778
时光说笑
时光说笑 2020-11-27 10:46

I\'m hoping to sort the items returned in the following query by the order they\'re entered into the IN() function.

INPUT:

SELECT id         


        
相关标签:
6条回答
  • 2020-11-27 11:33

    just use

    order by INSTR( ',B,C,D,A,' ,  concat(',' , `field`, ',' ) )
    

    avoid the situation like

     INSTR('1,2,3,11' ,`field`) 
    

    will end with unordered result row : 1 and 11 alternant

    0 讨论(0)
  • 2020-11-27 11:39
    SELECT id, name
    FROM mytable
    WHERE name IN ('B', 'A', 'D', 'E', 'C')
    ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')
    

    The FIELD function returns the position of the first string in the remaining list of strings.

    However, it is much better performance-wise to have an indexed column that represents your sort order, and then sort by this column.

    0 讨论(0)
  • 2020-11-27 11:44

    May be this can help someone (p_CustomerId is passed in SP):

    SELECT CompanyAccountId, CompanyName
    FROM account
    LEFT JOIN customer where CompanyAccountId = customer.AccountId
    GROUP BY CompanyAccountId
    ORDER BY CASE WHEN CompanyAccountId IN (SELECT AccountId 
                                              FROM customer
                                              WHERE customerid= p_CustomerId) 
                     THEN 0
                     ELSE 1
              END, CompanyName;
    

    Description: I want to show the account list. Here i am passing a customer id in sp. Now it will list the account names with accounts linked to that customers are shown at top followed by other accounts in alphabetical order.

    0 讨论(0)
  • 2020-11-27 11:45

    Try something like

    ... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...
    
    0 讨论(0)
  • 2020-11-27 11:51

    You need another column (numeric) in your table, in which you specify the sort order. The IN clause doesn't work this way.

    B - 1
    A - 2
    D - 3
    E - 4
    C - 5
    
    0 讨论(0)
  • 2020-11-27 11:52

    Another option from here: http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html

    select * 
    from tablename 
    order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;
    

    So in your case (untested) would be

    SELECT id, name
    FROM mytable
    WHERE name IN ('B', 'A', 'D', 'E', 'C')
    ORDER BY name = 'B', name = 'A', name = 'D', name =  'E', name = 'C';
    

    Depending what you're doing I've found it a bit quirky but always got it to work after playing with it a bit.

    0 讨论(0)
提交回复
热议问题