如何按此顺序从Mysql中检索结果?

时间:2011-07-19 17:47:25

标签: mysql sql

我有一个带有列的表,我们称之为“查询”,这是一个varchar。

我想将这些值检索到一个分页列表中,每个页面将包含208个结果,8个字母表中的每个字母。

所以在第1页上,前8个结果将以“a”开头,接下来的8个将以“b”开头,依此类推,直到“z”(如果该字母没有任何结果,那么它只会继续到下一封信。

在结果的第2页上,它将显示接下来的8个以“a”开头的结果,下一个以“b”开头,依此类推。

基本上不是按查询ASC排序,这将导致第一页的所有单词都以“a”开头,我希望每个页面都包含以字母表中每个字母开头的单词。

如果你觉得我没有正确解释自己(我这样做),那么请随意问。我脑子里有这个想法但是把它翻译成文字并不容易!

4 个答案:

答案 0 :(得分:1)

一个天真的开始方法可能是:

SELECT * FROM table1 WHERE `query` LIKE 'a%' ORDER BY `query` LIMIT 8
UNION
SELECT * FROM table1 WHERE `query` LIKE 'b%' ORDER BY `query` LIMIT 8
UNION
SELECT * FROM table1 WHERE `query` LIKE 'c%' ORDER BY `query` LIMIT 8
....

第二页需要使用

完成
SELECT * FROM table1 WHERE `query` LIKE 'a%' ORDER BY `query` LIMIT 8,8
UNION
....

第三页:

SELECT * FROM table1 WHERE `query` LIKE 'a%' ORDER BY `query` LIMIT 16,8
UNION
....

答案 1 :(得分:0)

您可以使用

的第一个字母使用组
group by left(query, 1)

从服务器端脚本中,显示查询结果的8个结果(可能使用页面编号* 8,从每个字母的索引开始,从第0页开始,即)

答案 2 :(得分:0)

我认为这不可能在一个声明中做(或者,可能,但执行速度太慢)。可能你必须看看MySQL准备好的语句或改变页面的行为。

答案 3 :(得分:0)

我永远不会在大型数据集上使用此查询,但为了个人乐趣,我找到了这个解决方案:

select *,
ceil(row_num/8) as gr 
from (
select
*,
@num := if(@word = substring(word,1,1), @num + 1, 1) as row_num,
@word := substring(word,1,1) as w
from words,(select @num:=0,@word:='') as r order by word ) as t
order by gr,word