Mysql - 如何通过交替(1,2,3,1,2,3,1,2,3)行来订购结果,是否可能?

时间:2009-12-24 19:07:23

标签: sql mysql ranking

我想通过客户端1,2,3,然后再次客户端1,2,3等来订购我的结果。

有没有办法在不使用for循环或进行三次单独查询的情况下执行此操作?不仅如此,我正在处理分页数据,因此它需要返回x结果,但始终如一。

有什么想法吗? GROUP BY也许?

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

5 个答案:

答案 0 :(得分:7)

使用:

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

答案 1 :(得分:0)

为什么不ORDER BY id

答案 2 :(得分:0)

GROUP BY不会有帮助。这是否可能取决于您的数据。基本上你需要一个复杂的ORDER BY基于其他价值观一起攻击某些东西。

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

ORDER BY FLOOR(project_id / 10), client_id

这不太可能对您的真实数据有用,但它提出您需要采用单独的字段,使该数据的某些子集等效于排序的目的(在这种情况下,所有内容都相同) 10s值)并在client_id上进行二次排序。

虽然它在很大程度上取决于最终公式,但这样的东西应该是一个相对稳定的排序,所以添加分页,例如通过

LIMIT 10, 10

应该返回一致的结果。

当然,这样做意味着你没有从索引中获益,所以如果你有很多行,它最终会比使用循环/单独查询做更慢。

答案 3 :(得分:0)

除非我读错了这个问题,否则你想要的是什么?

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

答案 4 :(得分:0)

听起来像客户端要做的事情。