2017-04-20 132 views
0

我想創建一個搜索功能,根據他們的標題和帖子標籤來搜索帖子。我想知道是否有可能做到這一點只是一個MySQL查詢,或者如果我需要使用2個查詢,然後使用PHP排序結果。「模糊」帖子標籤和帖子標題搜索mysql和php

我要查詢的表具有以下結構: Table structure

我試着做這樣的事情,但它返回重複的帖子:

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中使用LIKE非常慢,因爲沒有索引。

因此,我的問題是,如果有這種情況,最佳做法是什麼?

- 編輯 -

我添加它使用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; 
} 

回答

0

試試這個代碼什麼的PHP代碼:

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%'; 
+0

返回所有標籤的帖子。我只需要在標題或標籤上匹配的帖子。 – Marius

+0

@Marius我編輯了答案嘗試 –

0

你可以試試這個:

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 
+0

我可能是錯的,但是這似乎不會返回包含搜索查詢標題的帖子。 – Marius

+0

我不明白這可能是怎麼回事。看看where子句。它匹配標題包含「something」或其中一個tag_names包含「something」的所有記錄。如果兩者都是真的,它應該包括來自帖子的行。 –