4

我想按客户端 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
4

5 回答 5

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 是为了确保客户端是有序的。

于 2009-12-24T20:37:22.750 回答
0

为什么不ORDER BY id呢?

于 2009-12-24T19:48:51.850 回答
0

GROUP BY不会有帮助。这是否可能在很大程度上取决于您的数据。基本上,您需要一个复杂ORDER BY的基于其他值将某些东西破解在一起。

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

ORDER BY FLOOR(project_id / 10), client_id

这不太可能对您的真实数据有用,但它给出了这样一种想法,即您需要采用一个单独的字段,使该数据的一些子集等效于排序(在这种情况下,所有具有相同 10s 值的东西)并且对client_id 进行二次排序。

虽然很大程度上取决于最终的公式,但是像这样的东西应该是比较稳定的排序,所以加上分页,比如via

LIMIT 10, 10

应该返回一致的结果。

当然,这样做意味着拥有索引没有任何好处,所以如果你有很多行,它最终会比使用循环/单独查询慢。

于 2009-12-24T19:50:37.043 回答
0

除非我读错了这个问题是你想要的吗?

SELECT *
FROM table
WHERE client_id in (1, 2, 3)
ORDER by id, client_id
于 2009-12-24T20:12:20.350 回答
0

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

于 2009-12-24T20:18:47.250 回答