2012-03-11 78 views
1

在我的网页上,我抓取了一个数据库的数据并在结果页面上显示。我想排序的结果,并按顺序(这是翻译谷歌翻译)。我的意思是:我有一个名为“type”的字段,它的值为a,b或c。当我选择它返回的数据结果作为randomise SQL结果

aaaabbbccc

但我喜欢把它看作

abcabcabca

我的问题,究竟是什么(最好的解决方案是可能的一个SQL查询?)

感谢您的帮助!

+0

如果您提供了您所指的表的结构,它将会有所帮助。如果您有主键,并且能够按照abcabcabc的顺序添加行,那么您可以简单地按主键进行排序。 – Steve 2012-03-11 19:48:09

+0

该表有一个主键,但不容易/可能按正确的顺序插入它们 – Jab 2012-03-11 19:56:27

+0

因此,您不需要“随机”排序,您想避免连续两个相同的值?例如,如果数据是“a a a b c”呢?也许我误解了这个问题。无论哪种方式:需要澄清和清晰的规格。 – 2012-03-11 20:26:42

回答

0

解决方案背后的想法是使行的编号从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 

请注意,每个类型我们定义了一个不同的变量做计数器。作为最后一点,你可以在同一个连接中定义所有的计数器,然后你不使用union all,而是在select中你可以根据类型使用正确的变量。以下是平等的查询

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子句)选择的行,你将不需要再重复他们在每一个子查询是部分工会在第一版。

+0

完美的工作!非常感谢你!尽管我完全不理解脚本的工作原理。我是否正确:第一个选择选择所有数据,第二个选择通过类似于switch语句的语句通过所有选定的数据运行。如果类型相同,它会给它一个数字,临时保存在order_num中。第二个之后的部分是我不明白的部分。如果你愿意,你能解释一下吗,这样我就可以完全理解它了吗? – Jab 2012-03-12 15:26:31

+0

你所说的“第二选择”是子查询。它首先运行并收集所有数据并分配order_num。然后,hihger select运行,它可以在字段order_num和type中使用“order by”排序数据。 – 2012-03-12 15:40:35