2013-05-04 41 views
1

我在PHP中有一个字符串数组,名为。根据用户输入,该数组看起来像这样:groups [All,Sales]基于字符串数组的过滤记录PHP和MySQL

实施例:(更新后的表SCHEMA)

groups[] = ['Sales', 'All'] 

      ANNOUNCEMENT 
|description|masterID| groupName | 
======================================= 
| hello  | 1  | All, Final, | 
| greetings | 2  | Sales, All, | 
| demo  | 3  | Final,  | 

因此,从上表中它应仅返回 “你好” 和 “问候” 为输出因为基团[]具有销售全部作为行1具有所有和行2都有。请帮忙。我是SQL和PHP的业余爱好者。

我目前的尝试:

SELECT * FROM announcement WHERE groupName REGEXP '(Sales | All)' 

输出:

No rows affected 
+3

切勿在数据库中存储逗号分隔值。要检索它们,您需要通过LIKE“%Final%”进行全文搜索。 – sashkello 2013-05-04 12:47:31

+2

我会建议规范化你的数据库。用组名创建一个新表,并使用masterID和groupId创建另一个表。这会让你的生活更轻松。 – 2013-05-04 12:48:49

+0

感谢您的所有建议,但这是我必须与之合作。不能改变它,否则我会轻松解决这个问题。你能告诉我一个方法来处理这个吗? – 2013-05-04 12:51:16

回答

3
  1. 我猜,你的群体确实应该在字符串格式:groups[] = ['Final', 'All', 'Test']

  2. 这个$search = implode('|', $groups)将产生一个字符串Final|All|Test

  3. 现在您需要将此字符串放入您的查询中,以便通过任一单词或单词进行搜索。所以,这是WHERE groupName REGEXP '({$search})'。不要忘记查询内部的引号,以便它们不会与引用整个查询的引号冲突。

+0

现在就试试这个:) – 2013-05-05 14:01:57

+0

我改变了我的表模式,使它成为:'| description | masterID | groupName |'。请检查我上面更新的问题。 – 2013-05-05 15:08:55

+0

我试过REGEXP,它返回0条记录:( – 2013-05-05 15:19:43

1

MySQL不会把类似Perl的正则表达式。构建类似这样的查询:

SELECT description 
    FROM announcement NATURAL JOIN master 
WHERE groupName REGEXP '\\b(Final|All|Test)\\b'; 
+0

但是,如何获得REGEXP之间的每个组数组元素? – 2013-05-04 13:02:43

+0

我把它当做练习 - 但是像'$ query ='SELECT ... REGEXP \'\\\\ b('。implode('|',$ groups)。')\\\\ b \ '''会起作用。 – LHMathies 2013-05-04 13:29:29

+0

我很漂亮业余。虽然我正在谷歌上搜索如何做到这一点,但如果你能让我完成,我会很感激你。 – 2013-05-04 19:18:12