我可以从1个mysql列搜索所有结果有2次或更多次点击吗?

时间:2014-05-02 21:20:47

标签: php mysql

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时,这一行会出现

2 个答案:

答案 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');

然后您将用户的输入分成数字us1us2,...,us5并且您有

select * from test where
2 <= ((0 < find_in_set($us1, numbers)) + (0 < find_in_set($us2, numbers)) + ... )

SET是一个非常快的BITSET。