我可以从1 mysql列搜索所有结果与2或更多的命中


Can i search from 1 mysql column all results with 2 or more hits?

好的,所以我有基本的搜索脚本在我的网站,它工作得很好。但我在想,是否有可能(尝试在谷歌上搜索1天,发现0个相关主题)创建这种搜索:

我得到名为number的列。每一行从1到30有5个数字。我想创建搜索引擎,在那里我可以输入5个数字,并获得每行至少有2个特定数字的结果(因此消除那些只有1可以找到的)。

你可以给我任何帮助,只是告诉它是可能的,也许一些初学者,甚至一些基本的代码元素,如果你可以。我是php/mysql世界的新手,但学习速度很快

编辑:谢谢你的注释:所以数字都在一列。它们由小到大被分开。

例子:3、6、9、13、22

当我搜索数字:3,7,9,11,27时,这一行不会显示,当我搜索2,6,9,14,28时,这一行会显示

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数据库中起作用。

您可以将其存储为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,并且非常快。