Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql-我如何通过交替(1,2,3,1,2,3,1,2,3,)行对结果排序,可能吗?_Sql_Mysql_Ranking - Fatal编程技术网

Mysql-我如何通过交替(1,2,3,1,2,3,1,2,3,)行对结果排序,可能吗?

Mysql-我如何通过交替(1,2,3,1,2,3,1,2,3,)行对结果排序,可能吗?,sql,mysql,ranking,Sql,Mysql,Ranking,我想按客户机1、2、3排序结果,然后再按客户机1、2、3排序,依此类推 有没有一种方法可以做到这一点而不使用for循环或进行三个单独的查询?不仅如此,我还在处理分页数据,因此它需要返回x个结果,但要一致 有什么想法吗?也许分组 client_id project_id project_name ---------- ---------- ------------ 1 42 project abc 2 49 proj

我想按客户机1、2、3排序结果,然后再按客户机1、2、3排序,依此类推

有没有一种方法可以做到这一点而不使用for循环或进行三个单独的查询?不仅如此,我还在处理分页数据,因此它需要返回x个结果,但要一致

有什么想法吗?也许分组

client_id  project_id  project_name  
---------- ----------  ------------
 1         42          project abc
 2         49          project xyz
 3         41          project 123
 1         22          project apple
 2         29          project orange
 3         21          project banana

为什么不按id排序?

分组依据
不会有帮助。这是否可能在很大程度上取决于您的数据。基本上,您需要一个复杂的orderby,它可以根据其他值将某些内容组合在一起

例如,使用您提供的示例数据,您可以使用:

ORDER BY FLOOR(project_id / 10), client_id
这在实际数据上不太可能有用,但它提供了一个想法,即您需要使用一个单独的字段,使该数据的某些子集等效,以便进行排序(在本例中,所有数据都具有相同的10s值),并对客户机id进行二次排序

虽然这在很大程度上取决于最终的公式,但类似这样的排序应该是相对稳定的,因此添加分页,例如via

LIMIT 10, 10
应该返回一致的结果


当然,这样做意味着您没有从索引中获得任何好处,因此如果您有很多行,那么它最终会比使用循环/单独查询的速度慢。

除非我读错了问题,否则这就是您想要的吗

SELECT *
FROM table
WHERE client_id in (1, 2, 3)
ORDER by id, client_id

听起来像是要在客户端完成的事情。

使用:

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没有任何排名功能,但幸运的是,您可以使用变量。当客户端id与以前的客户端id不匹配时,关键是重置@rownum值-子查询中的ORDER BY是为了确保客户端处于有序状态。

能否显示您正在查找的输出示例?是否有某个列(或列组合)确定属于一个客户端的所有行的顺序?如果是这样的话,可以通过订购和一些修补来实现。请发布一些原始样本数据和所需输出。重新。分页:如果第三组行包含客户端1和客户端3的行,但不包含客户端2的行,您想怎么做?重新分组方式:我不认为这有什么帮助,分组方式本质上是将一组行展平,我认为您的问题主要是排序问题。我需要按客户id顺序交替排列客户1,然后是客户2,然后是客户3,重复
id
值不与任何
客户id
组共享,我需要将返回结果按1、2、3交替排序,然后再按1、2、3依次排序。这太棒了,我读了问题,在谷歌上搜索了一下,当我幸运地看到这一点时,我打算键入一个更简单的解决方案。我认为你不需要“ELSE@rownum”这个词,但除了这个好答案!