Mysql - How do I order results by alternating (1,2,3, 1, 2, 3, 1, 2, 3,) rows, is it possible?

后端 未结 5 1716
南旧
南旧 2020-12-10 20:48

I want to order my results by client 1, 2, 3, then again client 1, 2, 3, and so on.

Is there a way to do this without using a for loop or making three separate queri

相关标签:
5条回答
  • 2020-12-10 21:32

    Why not ORDER BY id?

    0 讨论(0)
  • 2020-12-10 21:34

    Sounds like something to be done client-side.

    0 讨论(0)
  • 2020-12-10 21:41

    Use:

    SELECT x.client_id, 
           x.project_id,
           x.project_name
      FROM (SELECT t.client_id,
                   t.project_id,
                   t.project_name,
                   CASE
                     WHEN @client_id != t.client_id THEN @rownum := 0
                     WHEN @client_id = t.client_id THEN @rownum := @rownum + 1
                     ELSE @rownum 
                   END AS rank,
                   @client_id := t.client_id
              FROM TABLE t,
                   (SELECT @rownum := 0, @client_id
          ORDER BY t.client_id) r) x
    ORDER BY x.rank, x.client_id
    

    MySQL doesn't have any ranking functionality, but luckily you can use variables. The key was resetting the @rownum value when the client_id doesn't match the previous client_id - the ORDER BY in the subquery is to ensure that clients are in order.

    0 讨论(0)
  • 2020-12-10 21:44

    GROUP BY is not going to be helpful. Whether this is possible is going to depend a lot on your data. Basically you would need a convoluted ORDER BY that hacked something together based on other values.

    For instance, using the example data you gave, you could use:

    ORDER BY FLOOR(project_id / 10), client_id
    

    This is unlikely to be useful on your real data but it gives the idea that you would need to take a separate field, make some subsets of that data be equivalent for the purpose of sorting (in this case, everything with the same 10s value) and the have a secondary sort on client_id.

    Although it depends a lot on the final formula, something like this should be a relatively stable sort, so adding pagination, such as via

    LIMIT 10, 10
    

    should return consistent results.

    Of course, doing this means you get no benefits from having indexes so if you have a lot of rows, it will end up being slower than doing something with loops/separate queries.

    0 讨论(0)
  • 2020-12-10 21:44

    Unless I read the question wrong is this what you want?

    SELECT *
    FROM table
    WHERE client_id in (1, 2, 3)
    ORDER by id, client_id
    
    0 讨论(0)
提交回复
热议问题