Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;模糊的;帖子标签和帖子标题在mysql和php中搜索_Php_Mysql - Fatal编程技术网

&引用;模糊的;帖子标签和帖子标题在mysql和php中搜索

&引用;模糊的;帖子标签和帖子标题在mysql和php中搜索,php,mysql,Php,Mysql,我想创建一个搜索功能,根据帖子的标题和标签搜索帖子。我想知道是否可以只使用一个mysql查询,或者是否需要使用两个查询,然后使用php对结果进行排序 我要查询的表具有以下结构: 我尝试过这样做,但它会返回重复的帖子: SELECT post_tags.id, post_tags.tag_id, posts.id, tags.tag_name, posts.title FROM post_tags JOIN tags ON (tags.tag_name LIKE '%something%' A

我想创建一个搜索功能,根据帖子的标题和标签搜索帖子。我想知道是否可以只使用一个mysql查询,或者是否需要使用两个查询,然后使用php对结果进行排序

我要查询的表具有以下结构:

我尝试过这样做,但它会返回重复的帖子:

SELECT post_tags.id, post_tags.tag_id, posts.id, tags.tag_name, 
posts.title
FROM post_tags
JOIN tags ON (tags.tag_name LIKE '%something%' AND post_tags.tag_id = tags.id)
JOIN posts ON (posts.title LIKE '%something%' OR post_tags.post_id = posts.id);
我还听说在mysql中使用
比如
非常慢,因为没有索引

因此,我的问题是,如果有这种情况,什么是最佳做法

--编辑--

我添加了php代码,它使用2个查询来实现我想要的

function search($query, $con = null){
    $conn = (isset($con) ? $con : get_conn());
    $logged_in_user_id = current_user.id;

    $posts = Array();
    $param = "%$query%";
    if($stmt = $conn->prepare("SELECT posts.id, posts.title ...
                                      FROM post_tags
                                      JOIN tags ON  post_tags.tag_id = tags.id
                                      JOIN posts ON  (post_tags.post_id = posts.id OR posts.title LIKE ?)
                                      WHERE posts.title LIKE ? OR tags.tag_name LIKE ?;")){
        $stmt->bind_param('sss', $param,$param, $param);
        $stmt->execute();
        $stmt->bind_result($id, $title ...);
        while($stmt->fetch()){
            if(!array_key_exists($id, $posts)){
                $posts[$id] = new Post($id, $title ...);
            }
        }
    }

    return $posts;
}
请尝试以下代码:

SELECT  posts.id, posts.title
FROM post_tags
JOIN tags ON  post_tags.tag_id = tags.id
JOIN posts ON  post_tags.post_id = posts.id
WHERE tags.tag_name LIKE '%something%' OR posts.title LIKE '%something%';
你可以试试这个:

SELECT 
    p.id, 
    p.title,
    GROUP_CONCAT(t.tag_name) as `tags`,
FROM posts p
JOIN post_tags p1
ON pt.post_id = posts.id
JOIN tags t
ON pt.tag_id = tags.id
WHERE p.title LIKE '%something%' OR t.tag_name LIKE '%something%'
GROUP BY p.id
ORDER BY p.title

我可能错了,但这似乎没有返回包含搜索查询的标题的帖子。我不明白这是怎么回事。看看where子句。它匹配标题包含“某物”或其中一个标记名包含“某物”的所有记录。如果其中一个为真,它应该包括post中的行。这将返回post的所有标记。我只需要在标题或标签上匹配的帖子。