MySQL中的顺序排序

时间:2017-05-22 00:10:51

标签: mysql sql-order-by

我正在尝试为我的问题实现解决方案,但我找不到方法:我在MySQL中有一个用户/电子邮件/域表,我想按域字段选择和排序,例如结果会给我一个顺序列表,一次一个域。

例如:假设我的全表是10个用户使用domain @ gmail.com; 10个用户使用域名@ aol.com,5个用户使用域名@ hotmail.com。订购结果到我的SELECT名称,域FROM mytable ORDER BY ???应该是:

user_x, aol.com
user_z, gmail.com
user_y, hotmail.com
user_a, aol.com
user_c, gmail.com
user_i, hotmail.com
...  when my five @hotmail.com records finished 
user_p, aol.com
user_j, gmail.com
user_t, aol.com
user_f, gmail.com
...

等等。

任何人都知道如何获得此订购?

1 个答案:

答案 0 :(得分:0)

我能想到的一种方法是在MySQL查询中实现这一目标。但它并不漂亮,它依赖于用户定义变量的行为,记录为 undefined。

考虑一下。如果我们有一组像这样的行:

user    domain      seq_
------  ------      ----
user_a  aol.com        1
user_p  aol.com        2
user_t  aol.com        3
user_x  aol.com        4
user_c  gmail.com      1
user_f  gmail.com      2
user_j  gmail.com      3
user_z  gmail.com      4
user_y  hotmail.com    1
user_i  hotmail.com    2

然后我们可以ORDER BY seq_, domain, user来实现指定的结果。

诀窍是获取seq_列的值。

我们可以这样做:按domain排序行,然后按顺序处理行。如果我们将域的值从当前行保存到用户定义的变量中,那么我们可以将其用于下一行,进行比较(将当前行的值与前一行保存的值进行比较)。 )如果domain的值相同,我们增加seq_,否则,我们将seq_重置为1.

正如我所说,它并不漂亮:

SELECT d.user
     , d.domain
  FROM ( SELECT @seq    := IF(t.domain = @domain, @seq + 1, 1) AS seq_
              , @domain := t.domain                            AS domain
              , t.user                                         AS user
           FROM ( SELECT @domain = '', @seq := 0 ) i
          CROSS
           JOIN mytable t
          ORDER
             BY t.domain
              , t.user
       ) d
 ORDER 
    BY d.seq_
     , d.domain
     , d.user

同样,这依赖于用户定义变量的行为,这是不能保证的。但是通过精心设计的查询,我们可以观察到MySQL 5.1,5.5和5.6的一致行为。