例如胆号我设置了8,9,10,11这4个号码
出现个数为2
那么我过滤出来的结果应包含8,9,10,11的其中2个
数据表结构
id hong1 hong2 hong3 hong4 hong5 hong6
用mysql语句能实现这个查询吗?应该怎么写?
出现个数为2 什么意思? 不太能理解你的需求
是4列里面随机筛选2列出来吗?
我这样解释吧!
胆码组:由1到33个红球号码组成,选择一组用户认为要出现的号码,并设置要出现的个数,组合起来确定出号条件。例如设定胆码组号码为1,11,22,出现个数为2,则在过滤结果中的每注号码包含1,11,22中的其中两个。
胆号在hong1、hong2、hong3、hong4、hong5里面筛选出来?
1、问题根本没说清楚。。。
胆号存储到数据库表中的哪个字段中,只有知道数据存储的地方才能写SQL来筛选数据
2、首先要先有数据才能查询
数据哪里来的?存储到哪里?
这个个人理解应该是有个号码池,通过程序控制:获得胆号池,从胆号池中选出目标个数的胆号,然后存储到数据库
但是看你的表没有存储胆号的地方啊,只要要有字段存储。
3、先想想清楚具体的需求,设计合理的表结构,这样会给以后使用数据提供很大的便利。
1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 6 7
1 2 3 5 6 7
1 2 4 5 6 7
1 3 4 5 6 7
2 3 4 5 6 7
1 2 3 4 5 8
1 2 3 4 6 8
1 2 3 5 6 8
数据表字段就是 hong1 hong2 hong3 hong4 hong5 hong6
胆号就是33个红球里面自定义的 例如胆号我选的3,4,7 出现的个数为2的话
那如果在上面这些数据去筛选的话
正确的结果应该是包含3,4或者3,7或者4,7的组合
简单来说就是要在上面这些数据筛选出包含3,4或者3,7或者4,7的组合
出现胆号个数如果固定是2的话,可以程序中将输入的胆号池分解为列举成所有可能的2胆号组合,然后使用sql筛选出列举的2胆号组合的单个结果集,合并到一起返回。
SELECT * FROM `tb_ssq`
where (hong1 = 3 and hong2=4)
or (hong1 = 3 and hong3=4)
or (hong1 = 3 and hong4=4)
or (hong1 = 3 and hong5=4)
or (hong2 = 3 and hong3=4)
or (hong2 = 3 and hong4=4)
or (hong2 = 3 and hong5=4)
or (hong3 = 3 and hong4=4)
or (hong3 = 3 and hong5=4)
or (hong4 = 3 and hong5=4)
select * from (
select *,r.one+r.two+r.three result --求出胆号出现次数
from (
SELECT
id,
hong1,
hong2,
hong3,
hong4,
hong5,
hong6,
-- 判断是否包含第一个胆号 3为动态传入数据
CASE
WHEN hong1 = 3 THEN
1
WHEN hong2 = 3 THEN
1
WHEN hong3 = 3 THEN
1
WHEN hong4 = 3 THEN
1
WHEN hong5 = 3 THEN
1
WHEN hong6 = 3 THEN
1
ELSE
0
END one,
-- 判断是否包含第二个胆号 4为动态传入数据
CASE
WHEN hong1 = 4 THEN
1
WHEN hong2 = 4 THEN
1
WHEN hong3 = 4 THEN
1
WHEN hong4 = 4 THEN
1
WHEN hong5 = 4 THEN
1
WHEN hong6 = 4 THEN
1
ELSE
0
END two,
-- 判断是否包含第三个胆号 7为动态传入数据
CASE
WHEN hong1 = 7 THEN
1
WHEN hong2 = 7 THEN
1
WHEN hong3 = 7 THEN
1
WHEN hong4 = 7 THEN
1
WHEN hong5 = 7 THEN
1
WHEN hong6 = 7 THEN
1
ELSE
0
END three
-- 后续可自行扩展
FROM `tb_ssq`) r
) rr
where rr.result >= 2 -- 胆号符合条件的个数
可根据需求自行扩展下,现在这个是3个里面筛出2个及以上的,在Mapper里面用<if>标签判断下有没有参数就好