我正在尝试为我的问题实现解决方案,但我找不到方法:我在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
...
等等。
任何人都知道如何获得此订购?
答案 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的一致行为。