我有一个类似于以下内容的MySQL表:
uid title
____ ________
aaac A, 73, B5
aaab A, B6
"标题"包含由逗号分隔的一串值。标题中始终至少有两个值。我需要查询此表并返回uid。我将通过POST传递一个字符串来检查标题。但是,此字符串的顺序并不重要。字符串可能如下所示:
73, B5, A
这需要返回aaaa
如何设置查询?
答案 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 statement和bind_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