Mysql 对行进行排序以均匀分布公共记录

Mysql 对行进行排序以均匀分布公共记录,mysql,sql,Mysql,Sql,我有一个包含以下数据的表格: +----+-------+---------+ | id | name | country | +----+-------+---------+ | 1 | alice | usa | | 2 | bob | usa | | 3 | chad | russia | | 4 | derek | china | | 5 | ethan | usa | +----+-------+---------+ 在sql中,除了O

我有一个包含以下数据的表格:

+----+-------+---------+
| id | name  | country |
+----+-------+---------+
|  1 | alice | usa     |
|  2 | bob   | usa     |
|  3 | chad  | russia  |
|  4 | derek | china   |
|  5 | ethan | usa     |
+----+-------+---------+
在sql中,除了ORDER BY RAND(),还有什么方法可以对我的表进行重新排序,从而允许我以这样一种方式显示记录,即每一连续行显示一个唯一的国家。i、 e.如果前一行也有国家“usa”,则尽可能长时间显示另一个国家的记录

在上述情况下,可能的输出之一是:

+----+-------+---------+
| id | name  | country |
+----+-------+---------+
|  1 | alice | usa     |
|  3 | chad  | russia  |
|  2 | bob   | usa     |
|  4 | derek | China   |
|  5 | ethan | usa     |
+----+-------+---------+

我基本上是在尝试分布行,以便在大多数记录具有共同支配值的情况下,它们看起来更分散。

可能有点做作

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,name VARCHAR(12) NOT NULL UNIQUE
,country VARCHAR(12) NOT NULL
);

INSERT INTO my_table VALUES
(1,'alice','usa'),
(2,'bob','usa'),
(3,'chad','russia'),
(4,'derek','china'),
(5,'ethan','usa'),
(6,'fred','usa');

SELECT id,name,country FROM (SELECT *, @i:=@i+1 i FROM my_table,(SELECT @i:=0) vars ORDER BY country = 'usa') a ORDER BY MOD(i,4), id;
+----+-------+---------+
| id | name  | country |
+----+-------+---------+
|  2 | bob   | usa     |
|  3 | chad  | russia  |
|  5 | ethan | usa     |
|  4 | derek | china   |
|  6 | fred  | usa     |
|  1 | alice | usa     |
+----+-------+---------+
6 rows in set (0.00 sec)
回顾评论,似乎你真正想要的是这样的东西

SELECT x.* 
  FROM my_table x 
  JOIN my_table y 
    ON y.country = x.country 
   AND y.id <= x.id 
 GROUP 
    BY x.id 
 ORDER 
    BY COUNT(*), country;
+----+-------+---------+
| id | name  | country |
+----+-------+---------+
|  4 | derek | china   |
|  3 | chad  | russia  |
|  1 | alice | usa     |
|  2 | bob   | usa     |
|  5 | ethan | usa     |
|  6 | fred  | usa     |
+----+-------+---------+
选择x.*
从我的表x
加入我的桌子
关于y.country=x.country

y.id这是不可能的。如果您还有一行带有
“usa”
,则不存在此类排序。因此,会出现“尽可能长的时间”。如果没有,它可以显示剩余的“usa”行。这有助于解决问题,但我决不会知道表格中有大量的“usa”,因为数据每天都在变化。我基本上是在寻找一种解决方案,可以确保前一条记录的值与当前记录的值在相同的时间内不同possible@JKerr这是一个更容易的要求,但这不是你所要求的美国’、‘俄罗斯’、‘中国’、‘美国’、‘美国’(或‘俄罗斯’、‘中国’、‘美国’、‘美国’、‘美国’)是比‘美国’、‘俄罗斯’、‘美国’、‘中国’、‘美国’更简单的要求谢谢!你修改后的答案解决了我的问题。但看到‘美国’、‘俄罗斯’、‘美国’、‘中国’、‘美国’情景的解决方案真的很有趣too@JKerr不幸的是,那个比我的工资等级高。