&引用;模糊的;帖子标签和帖子标题在mysql和php中搜索
我想创建一个搜索功能,根据帖子的标题和标签搜索帖子。我想知道是否可以只使用一个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
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的所有标记。我只需要在标题或标签上匹配的帖子。