在查询中检索类似的项目

时间:2015-09-01 17:44:10

标签: php mysql arrays mysqli

我想检索类似的项目:

$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,那么它将不匹配。

2 个答案:

答案 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和查询来对其进行过滤。