Sort by order of values in a select statement “in” clause in mysql

后端 未结 4 856
挽巷
挽巷 2020-11-28 07:24

I\'m selecting a set of account records from a large table (millions of rows) with integer id values. As basic of a query as one gets, in a sense. What I\'m doing us build

相关标签:
4条回答
  • 2020-11-28 08:06

    Actually, this is better:

    SELECT * FROM your_table
    WHERE id IN (5,2,6,8,12,1)
    ORDER BY FIELD(id,5,2,6,8,12,1);
    

    heres the FIELD documentation:

    http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field

    0 讨论(0)
  • 2020-11-28 08:10

    If your query is 60K, that's a sign that you're doing it the wrong way.

    There is no other way to order the result set than by using an ORDER BY clause. You could have a complicated CASE clause in your order by listing all the elements in your IN clause again, but then your query would probably be 120K.

    I know you don't want to, but you should put the values in the IN clause in a table or a temporary table and join with it. You can also include a SortOrder column in the temporary table, and order by that. Databases like joins. Doing it this way will help your query to perform well.

    0 讨论(0)
  • 2020-11-28 08:11

    A bit of a trick....

    SELECT * FROM your_table
    WHERE id IN (5,2,6,8,12,1)
    ORDER BY FIND_IN_SET(id,'5,2,6,8,12,1') DESC;
    

    note that the list of ID's in the find_in_set is a string, so its quoted. Also note that without DESC, they results are returned in REVERSE order to what the list specified.

    0 讨论(0)
  • 2020-11-28 08:14

    You're first query surely uses an order by clause. So, you could just do a join, and use the same order by clause.

    For example, if this was your first query

    SELECT customer_id
      FROM customer  
     WHERE customer_id BETWEEN 1 AND 100 
    ORDER
        BY last_name
    

    And this was your second query

    SELECT inventory_id
      FROM rental
     WHERE customer_id in (...the ordered list...)
    

    Combined would be

    SELECT r.inventory_id
      FROM rental r
    INNER
      JOIN customer c
        ON r.customer_id = c.customer_id    
     WHERE c.customer_id BETWEEN 1 AND 100 
    ORDER
        BY c.last_name
    
    0 讨论(0)
提交回复
热议问题