求在一组数据内至多包含2个数据的记录个数,多谢

itcaicai 2012-05-25 08:52:10
原数据库table存储类似于下面的信息有好多记录
通过select l1,l2,l3,l4,l5 from table 可以得到如下数据

1 2 3 4 5
1 3 8 14 16
16 18 22 24 26
15 14 23 28 30
26 28 30 31 33

现在希望从这5条记录中按如下限定输出,即$arr=array(1,8,14,20,22,24,26,29,30,31,32,33),求在$arr中至多出现2个数字的记录是什么,当然可以选择从上面得出的记录中选,如果能在select的where条件中限定就更好了。先行谢过啦!~~~
...全文
153 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
itcaicai 2012-05-26
  • 打赏
  • 举报
回复
调试时还是有点问题,如果查询的结果集存储用表联合的形式存储个临时表到数据库,估计会更好点,在研究下!~~求其他意见.
xuzuning 2012-05-26
  • 打赏
  • 举报
回复
mysql_connect();
mysql_select_db('test');
mysql_query('DROP TABLE IF EXISTS tset');
mysql_query('
CREATE TABLE IF NOT EXISTS test (
id int(11) NOT NULL AUTO_INCREMENT,
l1 varchar(2) NULL,
l2 varchar(2) NULL,
l3 varchar(2) NULL,
l4 varchar(2) NULL,
l5 varchar(2) NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM
');
mysql_query('TRUNCATE TABLE test');
mysql_query("insert into test (l1, l2, l3, l4, l5) values
('1', '2', '3', '4', '5'),
('1', '3', '8', '14', '16'),
('16', '18', '22', '24', '26'),
('15', '16', ' 23', '28', '3'),
('26', '28', '30', '31', '33')
");

$arr = array(1,8,14,20,21,24,26,29,30,31,32,33);
$s = "select '" .join("' as ch union all select '", $arr) . "'";

$sql = "select count(*) as cnt, a.* from
(select id, concat(l1,',',l2,',',l3,',',l4,',',l5) as p from test) a
left join
($s) b
on find_in_set(b.ch, a.p) group by a.id HAVING cnt<3";
$rs = mysql_query($sql) or die(mysql_error());
while($r = mysql_fetch_assoc($rs)) {
echo join(', ', $r), PHP_EOL;
}
1, 1, 1,2,3,4,5
2, 3, 16,18,22,24,26
1, 4, 15,16, 2,28,3
itcaicai 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
中间的from之后一串union all替换为你的table


SQL code


SELECT * FROM(SELECT *,(if(find_in_set(a, '1,8,14,20,22,24,26,29,30,31,32,33'), 1, 0) + if(find_in_set(b, '1,8,14,20,22,24,26,29,30,31,32,33'), 1, 0)……
[/Quote]
拜读了,联合子查询然后取需要的条件,深受启发启发,我会编辑到我的WHILE循环中去的,100多万条记录的查询,我在研究研究,看还有什么捷径不!~不过find_in_set比SQL中的in和数组中的交集函数与差集函数好用多了!~~~万分感激。
amani11 2012-05-25
  • 打赏
  • 举报
回复
中间的from之后一串union all替换为你的table


SELECT * FROM(SELECT *,(if(find_in_set(a, '1,8,14,20,22,24,26,29,30,31,32,33'), 1, 0) + if(find_in_set(b, '1,8,14,20,22,24,26,29,30,31,32,33'), 1, 0) + if(find_in_set(c, '1,8,14,20,22,24,26,29,30,31,32,33'), 1, 0) + if(find_in_set(d, '1,8,14,20,22,24,26,29,30,31,32,33'), 1, 0) + if(find_in_set(e, '1,8,14,20,22,24,26,29,30,31,32,33'), 1, 0) ) cnt FROM (SELECT 1 a, 2 b, 3 c, 4 d, 5 e union all
SELECT 1, 3, 8, 14, 16 union all
SELECT 16, 18, 22, 24, 26 union all
SELECT 15, 14, 23, 28, 30 union all
SELECT 26, 28, 30, 31, 33) t) s WHERE cnt<=2


结果
1 2 3 4 5 [1]
15 14 23 28 30 [2]
itcaicai 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
没看懂啊。从数组中求“至多出现2个数字”的元素?
[/Quote]

记录中至多包含数组$arr=array(1,8,14,20,22,24,26,29,30,31,32,33)里的一堆数字中至多有2个出现

第1组1 2 3 4 5 出现一个1,符合条件
第2组1 3 8 14 16 出现1,8,14,不符合
第3组16 18 22 24 26 出现24,26,只有2个符合
第4组15 16 23 28 3 出现0个符合
第5组26 28 30 31 33 出现26 30 31 334个不符合条件
不知道我这样说清楚不?
一起混吧 2012-05-25
  • 打赏
  • 举报
回复
没看懂啊。从数组中求“至多出现2个数字”的元素?

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧