Okey,所以我在我的网站上有基本的搜索脚本,它运行良好。但我想是甚至可能(尝试谷歌1天,找到0个相关主题)来创建这种搜索:
我的列名为number。每行有1-30个数字。我想创建搜索引擎,我可以在其中输入5个数字,并获得每行至少有2个特定数字的结果(因此消除只能找到1个数字的那些)。
你可以给我任何帮助,只要告诉它是可能的,也许是一些启动者,甚至是代码的一些基本元素,如果可以的话。我是php / mysql世界的新手,但学得很快
编辑:感谢您注意:所以这些数字都在1列中。它们被分开,从最小到最大。
示例:3,6,9,13,22
当我搜索数字时:3,7,9,11,27这行不会出现,当我搜索2,6,9,14,28时,这一行会出现
答案 0 :(得分:3)
MySQL的一个特点是,true和false分别是整数 1和0。
我知道,这很奇怪,但这意味着您可以添加布尔术语,总和是评估为真的术语数。
例如,要从列表1,3,7,11,17中搜索至少两个数字的存在:
SELECT * FROM `no_one_ever_names_their_table_when_asking_sql_questions`
WHERE (1 IN (col1,col2,col3,col4,col5)
+ 3 IN (col1,col2,col3,col4,col5)
+ 7 IN (col1,col2,col3,col4,col5)
+ 11 IN (col1,col2,col3,col4,col5)
+ 17 IN (col1,col2,col3,col4,col5)) >= 2
有一点需要注意的是,这种布尔整数的技巧并不适用于标准SQL,所以不要指望它能在其他品牌的SQL数据库中运行。
答案 1 :(得分:0)
您可以将其存储为5列(numcol1
,...,numcol5
)。然后,您可以找到与
WHERE 2 <= if(find_in_set(numcol1, '12,25,7') > 0, 1, 0) + if(find_in_set(numcol2, '12,25,7') > 0, 1, 0) + ...
或者更紧凑,更神秘,更酷:
WHERE 2 <= ((find_in_set(numcol1, '12,25,7') > 0) + (find_in_set(numcol2, '12,25,7') > 0 ) + ... )
您也可以使用Bitset,但是您的应用程序必须确保只设置了5个值:
create table test (id int(11) not null auto_increment primary key,
numbers SET('1','2','3',...,'30');
然后您将用户的输入分成数字us1
,us2
,...,us5
并且您有
select * from test where
2 <= ((0 < find_in_set($us1, numbers)) + (0 < find_in_set($us2, numbers)) + ... )
SET是一个非常快的BITSET。