【问题标题】:randomise SQL results随机化 SQL 结果
【发布时间】:2012-03-11 19:43:56
【问题描述】:

在我的网页上,我获取数据库的数据并将其显示在结果页面上。我想对结果进行排序(这就是谷歌翻译的翻译)。我的意思是:我有一个名为“类型”的字段,它的值是 a、b 或 c。当我选择数据时,它会返回结果为

a a a a b b b c c c

但我喜欢把它看作

a b c a b c a b c a

我的问题是,最好的解决方案是什么(可以使用 SQL 查询吗?)

感谢您的帮助!

【问题讨论】:

  • 如果您提供您所指的表的结构会有所帮助。如果您有一个主键,并且能够按 abcabcabc 顺序添加行,那么您可以简单地按主键。
  • 该表有一个主键,但不容易/不可能以正确的顺序插入它们
  • 所以你不想“随机”排序,你想避免连续两个相同的值?例如,如果数据是a a a a a b c 怎么办?也许我误解了这个问题。无论哪种方式:需要澄清和明确的规范。
  • 在我的网站上,我在一个概览中比较了多个提供商。我希望每个结果都来自不同的提供商,当没有唯一的提供商时,我想从第一个开始重新开始。我想重复这个直到我用完结果。
  • “类型”字段中的值是预定义的吗?还是用户动态添加新类型?

标签: php mysql sorting


【解决方案1】:

解决方案背后的想法是根据提供者使行从 1 开始编号。如果“a”类型的行从 1..4 开始编号,“b”类型的行从 1..3 开始编号,“c”类型的行从 1..3 开始编号,那么您可以轻松获得你想在这些数字上使用“order by”。

例如,我假设您的表名是“my_table”,它有两个字段,类型和数据。

为了在mysql中生成rownum,我将使用这里描述的:rownum in mysql

现在假设我们要选择所有类型为“a”的行并给它们升序的行号。我们可以这样做:

select type,data,@rownuma := @rownuma+1 as order_num
from my_table,(select @rownuma:=0) ra
where type='a'

我们可以对其他类型执行相同的操作,然后合并所有结果,然后将它们包装在执行排序的外部选择中。您的问题的答案将是以下查询:

select type,data
from
(
select type,data,@rownuma := @rownuma+1 as order_num
from my_table,(select @rownuma:=0) ra
where type='a'
union all
select type,data,@rownumb := @rownumb+1 as order_num
from my_table,(select @rownumb:=0) rb
where type='b'
union all
select type,data,@rownumc := @rownumc+1 as order_num
from my_table,(select @rownumc:=0) rc
where type='c'
) in_tab
order by order_num,type

请注意,对于每种类型,我们定义了一个不同的变量来进行计数。

最后一点,您可以在同一个连接中定义所有计数器,然后不使用全部联合,而是在选择中根据类型使用正确的变量。下面是一个相等查询

select type,data
from
(
select type,data,
       case when type='a' then @rownuma := @rownuma+1 
            when type='b' then @rownumb := @rownumb+1
            when type='c' then @rownumc := @rownumc+1
       end as order_num
from my_table, (select @rownuma:=0) ra, (select @rownumb:=0) rb, (select @rownumc:=0) rc 
) in_tab
order by order_num,type

如果您有更多的条件(where 子句)来选择行,那么第二个版本会更好,因为您不需要在第一个版本中属于联合的每个子查询中重复它们。

【讨论】:

  • 完美地完成了这项工作!非常感谢!虽然我不完全理解脚本的工作原理。我对以下内容是否正确:第一个选择选择所有数据,第二个选择使用类似于 switch 语句的语句遍历所有选择的数据。如果类型相同,则给它一个数字,临时保存在 order_num 中。第二个之后的部分是我不明白的部分。如果你愿意,你能解释一下,以便我完全理解吗?
  • 您所说的“第二次选择”是子查询。它首先运行并收集所有数据并分配 order_num。然后,hihger select 运行,它可以使用字段 order_num 上的“order by”和 type 对数据进行排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 2013-01-07
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
相关资源
最近更新 更多