是否有一种性能友好的方式来列出数据库中每个字母的结果?

时间:2012-04-10 23:32:34

标签: mysql alphabet

我想创建一个索引页面,其中包含每个字母表的几个结果。

目前我有这个:

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。我知道'按兰德()排序并不是很好。但这只是在发展中。

4 个答案:

答案 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