【问题标题】:MySQL order by column, equal spread of valuesMySQL 按列排序,值的相等分布
【发布时间】:2015-09-23 16:10:19
【问题描述】:

我希望从表中选择数据子集,但希望确保从列中获得不同“类型”的相同组合。

例如,如果表格有一个名为“动物”的列,其中填充了以下内容:

name, animal
'Bob', 'cat'
'Fred','cat'
'Jim','dog'
'Sam','dog'
'Andy','snake'
'Paul','snake'

我想按动物类型均匀混合的顺序选择行,所以结果是:

['Bob','cat'],
['Jim','dog'],
['Andy','snake'],
['Fred','cat'],
['Sam','dog'],
['Paul','snake']

类似于随机化,但确保所有类型都被平等地包括在内。有没有办法在mysql中做到这一点?

【问题讨论】:

  • 您的意思是每种动物的数量相同(在这种情况下,每种动物有 2 个)?或者您是说您希望它们重新排列成组(猫、狗、蛇、{重复})?因为除了对行重新排序之外,这两组结果是相同的。

标签: mysql sql-order-by


【解决方案1】:

这为表中的每个名称提供了一个参考他们拥有的动物的索引,然后依次选择每个索引动物:

SELECT name, animal
  FROM (
    SELECT CASE 
             WHEN @animal = animal THEN @row := @row + 1
             ELSE @row := 0
           END row_num,
           name, 
           @animal := animal animal
      FROM owner
      JOIN (SELECT @animal := null, @row := 0) init
  ORDER BY animal, name
        ) temp
 ORDER BY row_num, animal

See Fiddle

请注意,任何备用动物都将附加到末尾。这是您想要的吗?

【讨论】:

  • 谢谢 Arth,这太完美了。
猜你喜欢
  • 2014-07-24
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
相关资源
最近更新 更多