我想创建一个索引页面,其中包含每个字母表的几个结果。
目前我有这个:
SELECT url_slug, name FROM artists WHERE name LIKE "A%" ORDER BY rand() LIMIT 10
SELECT url_slug, name FROM artists WHERE name LIKE "B%" ORDER BY rand() LIMIT 10
SELECT url_slug, name FROM artists WHERE name LIKE "C%" ORDER BY rand() LIMIT 10
SELECT url_slug, name FROM artists WHERE name LIKE "D%" ORDER BY rand() LIMIT 10
SELECT url_slug, name FROM artists WHERE name LIKE "E%" ORDER BY rand() LIMIT 10
SELECT url_slug, name FROM artists WHERE name LIKE "F%" ORDER BY rand() LIMIT 10
是否还有另一种更友好的方式来实现这一目标?
P.S。我知道'按兰德()排序并不是很好。但这只是在发展中。
答案 0 :(得分:2)
出于您想要获得的目的,查询不会比IMO更好。但是,如果表格很大,如果可能希望偶尔将缓存表分别保存固定字母的值。
根据字段索引您记录的索引。
答案 1 :(得分:1)
给它一个镜头,它对我的测试数据起作用了:
SELECT url_slug, name FROM artists WHERE name REGEXP '^[A-Z]';
- 更新 -
我得到了一个查询,它将提取所有名称(没有限制)并按字母分组,但没有限制,可能不值得。
# Note, you do not need the WHERE clause if you want all letters
# I left it in for dev testing
select GROUP_CONCAT(CONCAT(url_slug, ':', name)) AS list, substr(name, 1, 1) as letter from artists where name REGEXP '^[A-B]' group by letter;
您可以做的是每隔几个小时发出一次这样的查询并按字母缓存结果。我同意你的观点,我认为最好只查询一次,而不是查询26次,只要你没有为每个查询提取一个巨大的结果集,我认为可以填充缓存。 / p>
答案 2 :(得分:0)
我不是每个字母的“几个结果”的意思,但是你可以做这样的事情:
select left(name, 1), url_slug, group_concat(name)
from artists
group by left(name, 1);
每封信都会让你成为所有艺术家。
答案 3 :(得分:0)
表现不佳(26K记录在我的上网本上占用0.04秒)但有趣且比26个查询稍快 -
SELECT
url_slug, name,
IF( @prev <> LEFT(name, 1), @rownum := 1, @rownum := @rownum+1 ) AS rank,
@prev := LEFT(name, 1)
FROM(
SELECT * FROM artists ORDER BY LEFT(name, 1), RAND()
) tmp, (SELECT @rownum := NULL, @prev := '') init
HAVING rank <= 2