我想检索类似的项目:
$formatsArray = $_POST['formats'];
$topicsArray = $_POST['topics'];
// Converting the array into individual strings
$formats = implode("','", $formatsArray);
$topics = implode("','", $topicsArray);
$resources = "select * from resources where
format IN ('".$formats."')
AND topic IN ('".$topics."')";
我的问题是我不确定如何在查询中集成%%。因为我们说主题是Idea Generation
,而mysql表是Idea Generation,Customer Development
,那么它将不匹配。
答案 0 :(得分:0)
虽然可能有更好的方法,但这应该有效:
$formats = implode("% OR format LIKE %", $formatsArray);
$topics = implode("% OR topic LIKE %", $topicsArray);
$query = "SELECT * from resources WHERE (format LIKE %" . $formats . "%) AND (topic LIKE %" . $topics ."%)"
这看起来有点像黑客,但应该适合你的情况。
答案 1 :(得分:0)
使用您当前的数据库方案,请阅读MySQL中的FULL-TEXT
索引,因为这可能是您正在寻找的内容。 SQL中的LIKE
关键字仅在您搜索单例名称时才真正适用。 LIKE
将%
视为"通配符"并返回包含%
符号之前或之后的单词的任何行。
但是,无论如何,您的数据库架构似乎都是错误的。在这种情况下,您应该规范化数据,不要将主题名称存储在一列中。做这样的事情:
Table:resource
resource_id Primary Key Auto_increment, columnA, columnB
Table: format
resource_id int(11), format_name VARCHAR(150)
Table: topic
resource_id int(11), format_name VARCHAR(15)
这样,如果您的某些资源包含“主题创意”,“客户开发”等主题,您可以在topics
和连接resource_id
中插入两行,将它们绑定在一起。
这样,如果您想搜索某些数组中包含格式或主题的资源,您可以
<?php
$sql = "SELECT t1.resource_id FROM resources as t1
LEFT JOIN (
SELECT resource_id, format_name
FROM format
) as t2
ON t2.resource_id = t1.resource_id
LEFT JOIN (
SELECT resource_id, topic_name
FROM topic
) as t3
ON t3.resource_id = t1.resource_id";
foreach ($formats as $format) {
$sql .= "t2.format_name = '$format' OR"
}
$sql = trim($sql, ' OR');
$sql .= " AND ";
foreach ($topics as $topic) {
$sql .= "t3.topic_name = '$topic' OR"
}
$sql = trim($sql, ' OR');
//Run the query
?>
此查询应返回您为imploded
指定的数组中包含格式或主题的所有资源行。但是,查询会返回重复的行,因此您应该通过修改JOINS
和查询来对其进行过滤。