Mysql-我如何通过交替(1,2,3,1,2,3,1,2,3,)行对结果排序,可能吗?
我想按客户机1、2、3排序结果,然后再按客户机1、2、3排序,依此类推 有没有一种方法可以做到这一点而不使用for循环或进行三个单独的查询?不仅如此,我还在处理分页数据,因此它需要返回x个结果,但要一致 有什么想法吗?也许分组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
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”这个词,但除了这个好答案!