DROP FUNCTION IF EXISTS `INTE_ARRAY` delimiter // -- 集合交集检查函数 -- @param varchar(255) setA A 集合 如 "1,3,5,9" -- @param varchar(255) setB B 集合 如 "8,2,3,7" -- @return int(1) B 集合内
单元在 A集合 内存在则返回 1 否则返回 0 CREATE FUNCTION `INTE_ARRAY` (setA varchar(255),setB varchar(255)) RETURNS int(1) BEGIN DECLARE idx INT DEFAULT 0 -- B 集合单元索引 DECLARE len INT DEFAULT 0-- B 集合表达式长度 DECLARE llen INT DEFAULT 0-- 最后检查位置 DECLARE clen INT DEFAULT 0-- 当前检查位置 DECLARE tmpStr varchar(255)-- 临时检查
数据集 DECLARE curt varchar(255)-- B 当前检查的单元 SET len = LENGTH(setB) WHILE idx <len DO SET idx = idx + 1 SET tmpStr = SUBSTRING_INDEX(setB,",",idx) SET clen = LENGTH(tmpStr) -- 获取当前 setB 中的单元 IF idx = 1 THEN SET curt = tmpStr ELSE SET curt = SUBSTRING(setB,llen+2,clen-llen-1) END IF -- 检查是否存在于 setA 中 IF FIND_IN_SET(curt,setA) >0 THEN RETURN 1 END IF -- 当前检查终点与上次检查终点相同则跳出 IF clen <= llen THEN RETURN 0 END IF SET llen = clen END WHILE RETURN 0 END // delimiter select INTE_ARRAY("1,3,5,9","8,2,3,7") as is_inte_array --select INTE_ARRAY("1,3,5,9","2,8,6,10") as is_inte_array --select INTE_ARRAY("10,3,5,9","2,8,6,10") as is_inte_array --select INTE_ARRAY("1,30,5,9","2,8,6,10") as is_inte_array --select INTE_ARRAY("1,30,5,9","2,30,6,10") as is_inte_array你是要查前十个查询结果中相同的那些记录,而不求前十个相同记录吧,因为这是有差别的,按照你的语句,应该是求前者,即先
求出A的前十条数据,B的前十条数据,再求它们的交集。
既然是求交集,那么这两个表的关系模式应该是相同的了,
select
a.*
from
(select
*
from
table
order
by
table.a
desc
limit
10)
as
a,
(select
*
from
table
order
by
table.b
desc
limit
10)
as
b
where
a.primary_key
=
b.primary_key
--先将两个结果作为两张临时表,然后通过主键
primary_key来获取交集(交集肯定就是主键相等的了,因为关系模式相同)
评论列表(0条)