我有一个带有列的表,我们称之为“查询”,这是一个varchar。
我想将这些值检索到一个分页列表中,每个页面将包含208个结果,8个字母表中的每个字母。
所以在第1页上,前8个结果将以“a”开头,接下来的8个将以“b”开头,依此类推,直到“z”(如果该字母没有任何结果,那么它只会继续到下一封信。
在结果的第2页上,它将显示接下来的8个以“a”开头的结果,下一个以“b”开头,依此类推。
基本上不是按查询ASC排序,这将导致第一页的所有单词都以“a”开头,我希望每个页面都包含以字母表中每个字母开头的单词。
如果你觉得我没有正确解释自己(我这样做),那么请随意问。我脑子里有这个想法但是把它翻译成文字并不容易!
答案 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