这在mysql查询中可能吗?当前数据表为:
id - fruit - name
1 - Apple - George
2 - Banana - George
3 - Orange - Jake
4 - Berries - Angela
在 name
列,我想对其排序,以便在我的 select
查询。
我的愿望输出将是,没有连续的 george
在“名称”列中。
id - fruit - name
1 - Apple - George
3 - Orange - Jake
2 - Banana - George
4 - Berries - Angela
提前谢谢。
4条答案
按热度按时间kxxlusnw1#
在mysql 8+中,您可以执行以下操作:
在早期版本中,可以使用变量来实现这一点。
o7jaxewo2#
以下解决方案适用于所有mysql版本,尤其是<8.0版本
在派生表中,首先使用
name
以及id
.然后,在具有相同属性的所有行中,确定特定行的行号
name
价值观。现在,使用这个结果集并按行号值对其排序。因此,所有行号为1的行都将排在第一位(对于所有不同的
name
值)等。因此,连续name
行不会出现。可以使用用户定义的会话变量尝试以下操作:
db小提琴演示
uubf1zoe3#
另一个想法。。。
f8rj6qna4#
这是我的算法:
计算每个名字的频率
按频率降序和名称排序
切割成与最大频率一样大的分区
每个分区内的行数
按行号和分区号排序
例如:名称a、b、c、d、e
查询:
公共表表达式(
WITH
子句)和窗口函数(聚合OVER
)从mysql 8或mariadb 10.2开始提供。在此之前,您可以退回到子查询,这将使同一个查询相当长且难以阅读。我想你也可以用变量来代替。db小提琴演示:https://www.db-fiddle.com/f/8amyx6iru8asnyxjyz15df/1