mysql先排序再取唯一值_MySQL查询:当列表使用非唯一值排序时获取下一个或上一个项...

我记得我在MySQL性能博客上读到一篇关于

pagination

把这个例子搞得一团糟,可能会有帮助(@row_id是多余的)

drop table if exists gallery;

create table gallery

(

id int unsigned not null,

image varchar(255) not null,

rating tinyint unsigned default 0

)

engine=innodb;

insert into gallery values

(166,'6.png',9),(165,'8.png',9),(189,'1.png',8),

(171,'99.png',8),(169,'56.png',8),(155,'34.png',8),

(265,'7.png',7),(754,'86.png',6),(37,'37.png',4),

(342,'95.png',2),(99 ,'35.png',0),(76 ,'34.png',0),

(44 ,'3.png',0),(8 ,'22.png',0), (1001 ,'1001.png',0);

drop procedure if exists list_gallery_paged;

delimiter #

create procedure list_gallery_paged

(

in p_last_id int unsigned,

in p_last_rating tinyint unsigned

)

proc_main:begin

set @row_id = 0;

if p_last_id <= 0 then

select @row_id:=@row_id+1 as row_id, g.*

from gallery g order by rating desc, id desc limit 4;

else

select @row_id:=@row_id+1 as row_id, g2.*

from gallery g inner join gallery g2 on g.id = g2.id

where

g.rating <= p_last_rating and (g.id < p_last_id or g.rating < p_last_rating)

order by

g.rating desc, g.id desc limit 4;

end if;

end proc_main #

delimiter ;

-- in pages of 4 (use all rows)

select g.* from gallery g order by rating desc, id desc;

call list_gallery_paged(0,0);

call list_gallery_paged(171,8);

call list_gallery_paged(754,6);

call list_gallery_paged(99,0);

call list_gallery_paged(8,0);

-- one at a time (use top row only)

select g.* from gallery g order by rating desc, id desc;

call list_gallery_paged(265,7);

call list_gallery_paged(754,6);

call list_gallery_paged(37,4);

call list_gallery_paged(342,2);

call list_gallery_paged(1001,0);

call list_gallery_paged(99,0);

call list_gallery_paged(76,0);

call list_gallery_paged(44,0);

call list_gallery_paged(8,0);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您的多选参数允许用户输入任意,则可以使用 MySQL 的全文搜索功能来计算命中次数。以下是实现此目的的步骤: 1. 首,您需要将多选参数中的每个拆分成单独的单词,并将这些单词存储在一个表中。 例如,如果您的多选参数名为“param”,则可以使用以下查询创建一个表: ``` CREATE TEMPORARY TABLE temp_param_words SELECT DISTINCT word FROM ( SELECT DISTINCT TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(param, ',', n), ',', -1)) as word FROM your_table JOIN ( SELECT 1 as n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 ) numbers ON CHAR_LENGTH(param) - CHAR_LENGTH(REPLACE(param, ',', '')) >= n - 1 ) words; ``` 这将创建一个表,其中包含多选参数中的每个单词。 2. 接下来,您可以使用全文搜索功能计算每个行中包含多选参数单词的命中次数。 例如,您可以使用以下查询计算命中次数: ``` SELECT t.*, MATCH(t.param) AGAINST((SELECT GROUP_CONCAT(word SEPARATOR ' ') FROM temp_param_words)) AS hits FROM your_table t ORDER BY hits DESC; ``` 这将返回一个结果集,其中每一行都包含与主查询中的行相对应的多选参数命中次数。您可以使用“hits”列对结果进行排序。 请注意,以上查询假定多选参数中的单词由逗号分隔。如果您使用不同的分隔符,则需要相应地修改查询
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值