通过搜索顺序无关紧要的字符串来查询MySQL

时间:2017-08-27 20:33:35

标签: php mysql

我有一个类似于以下内容的MySQL表:

    uid       title 
    ____     ________
    aaac      A, 73, B5 
    aaab      A, B6

"标题"包含由逗号分隔的一串值。标题中始终至少有两个值。我需要查询此表并返回uid。我将通过POST传递一个字符串来检查标题。但是,此字符串的顺序并不重要。字符串可能如下所示:

    73, B5, A

这需要返回aaaa

如何设置查询?

1 个答案:

答案 0 :(得分:0)

首先,在一个字段中存储多个值会违反数据库的first rule in normalisation。如果你应用规范化,事情会变得容易多了。

但是考虑到这种情况,您可以使用where子句进行查询:

WHERE FIND_IN_SET(?, replace(title, ' ', ''))
AND   FIND_IN_SET(?, replace(title, ' ', ''))
AND   FIND_IN_SET(?, replace(title, ' ', ''))

您可以在PHP中动态创建每一行,例如:

$items = explode(",", $_POST["search"]);
$conditions = implode(" AND ", 
     array_fill(0, count($items), "FIND_IN_SET(?, replace(title, ' ', ''))")
);
$sql = "SELECT ......... WHERE $conditions";

然后使用prepared statementbind_params$items绑定到占位符(?)。

规范化方法

最好创建一个每个单独一条记录的新表:(uid, piece)

因此,而不是主表(table1)中的以下记录:

uid       title       other
____     ________     _______
aaac      A, 73, B5   x
aaab      A, B6       y

您将删除title列:

uid       title       other
____     ________     _______
aaac      A, 73, B5   x
aaab      A, B6       y

并将这些记录添加到新表table2

uid       piece      
____     ________    
aaac      A
aaac      73
aaac      B5
aaab      A
aaab      B6    

然后SQL看起来像:

FROM       table1 
INNER JOIN table2 ON table1.uid = table2.uid
WHERE      table2.piece in (?, ?, ?)
GROUP BY   table1.uid
HAVING     count(distinct table2.piece) = 3