2017-04-20 23 views
0

投稿のタイトルと投稿のタグに基づいて投稿を検索する検索機能を作成したいと思います。私はmysqlクエリだけでこれを行うことが可能かどうか、または2つのクエリを使用してPHPを使用して結果を並べ替える必要があるかどうか疑問に思います。私は照会する"Fuzzy"はタグと投稿を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を使用すると、インデックスが作成されないため、実際には遅いです。

私の質問は、この場合のベストプラクティスですか?

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

は、このコードを試してみたいものを達成するために2つのクエリを使用してPHPのコードを追加しました:

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

@マリアス私は答えを編集しました –

0

あなたはこれを試みる場合があります:

- - 編集

私は

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

私は間違っているかもしれませんが、これは検索クエリを含むタイトルの投稿を返さないようです。 – Marius

+0

私はそれがどうなるかはわかりません。 where節を見てください。これは、タイトルに「何か」が含まれているか、tag_namesのいずれかに「何か」が含まれているすべてのレコードに一致します。いずれかが真であれば、投稿の行を含める必要があります。 –

関連する問題