在我的网页上,我抓取了一个数据库的数据并在结果页面上显示。我想排序的结果,并按顺序(这是翻译谷歌翻译)。我的意思是:我有一个名为“type”的字段,它的值为a,b或c。当我选择它返回的数据结果作为randomise SQL结果
aaaabbbccc
但我喜欢把它看作
abcabcabca
我的问题,究竟是什么(最好的解决方案是可能的一个SQL查询?)
感谢您的帮助!
在我的网页上,我抓取了一个数据库的数据并在结果页面上显示。我想排序的结果,并按顺序(这是翻译谷歌翻译)。我的意思是:我有一个名为“type”的字段,它的值为a,b或c。当我选择它返回的数据结果作为randomise SQL结果
aaaabbbccc
但我喜欢把它看作
abcabcabca
我的问题,究竟是什么(最好的解决方案是可能的一个SQL查询?)
感谢您的帮助!
解决方案背后的想法是使行的编号从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子句)选择的行,你将不需要再重复他们在每一个子查询是部分工会在第一版。
完美的工作!非常感谢你!尽管我完全不理解脚本的工作原理。我是否正确:第一个选择选择所有数据,第二个选择通过类似于switch语句的语句通过所有选定的数据运行。如果类型相同,它会给它一个数字,临时保存在order_num中。第二个之后的部分是我不明白的部分。如果你愿意,你能解释一下吗,这样我就可以完全理解它了吗? – Jab 2012-03-12 15:26:31
你所说的“第二选择”是子查询。它首先运行并收集所有数据并分配order_num。然后,hihger select运行,它可以在字段order_num和type中使用“order by”排序数据。 – 2012-03-12 15:40:35
如果您提供了您所指的表的结构,它将会有所帮助。如果您有主键,并且能够按照abcabcabc的顺序添加行,那么您可以简单地按主键进行排序。 – Steve 2012-03-11 19:48:09
该表有一个主键,但不容易/可能按正确的顺序插入它们 – Jab 2012-03-11 19:56:27
因此,您不需要“随机”排序,您想避免连续两个相同的值?例如,如果数据是“a a a b c”呢?也许我误解了这个问题。无论哪种方式:需要澄清和清晰的规格。 – 2012-03-11 20:26:42