2016-07-20 7 views
2

私はいくつかのフィルタで簡単な検索システムを作ろうとしていますが、これらのフィルタの1つは、基本的にコメントの多い投稿とコメントの少ない投稿最終。 私はすべての投稿(タイトル、コンテンツ、画像、postId)を含む投稿用に1つと、すべてのコメント(コメントが投稿された投稿を確認するために)を含むコメント用に2つのテーブルを持っています。 私が使用して検索結果を表示するにはコメント数で投稿を並べ替え

$search = $db->prepare("SELECT comments.postId, comments.commentId, COUNT(comments.commentId) AS comms, posts.title, posts.postDate, posts.postId, posts.content, 
           FROM comments, posts, users 
           WHERE comments.postId = posts.postId AND posts.content LIKE ? OR posts.title LIKE ? 
           GROUP BY comments.commentId 
           ORDER BY comms DESC 
           LIMIT 100"); 
      $search->execute(array("%$q%", "%$q%")); 

::のように見える私は何かを検索するときに代わりに最初に最もコメントが投稿を表示するので、

foreach($search as $s) { 
?> 
    <a href="stream.php?viewPost=<?php echo $s['postId'];?>"> 
    <h5> 
     <?php echo $s['title']; ?> 
    </h5> 
    </a> 
    <small>Posted on <?php echo $s['postDate']; ?> </small> 
    <div class="divider"></div> 
<?php 
} 
      ?> 

しかし、それは実際に持っていること(1つのポストを示していますほとんどのコメント)。それは何度も何度も繰り返し表示されます。 削除した場合

GROUP BY comments.commentId 

これはその投稿を1回だけ表示します。

私が実際に見ないので、誰かが私がここで間違っていることを教えてくれたら、

答えて

1

はここにいくつかの観測です:

  • が適切な、明示的なJOIN構文を使用することを学びます。
  • 投稿を返信したい場合は、コメントIDでグループ化しないでください。
  • usersテーブルは使用されません。

したいクエリは、より次のようになります。

SELECT p.postId, p.title, p.postDate, posts.postId, p.content, 
     COUNT(c.commentId) AS comms, 
FROM posts p join 
    comments c 
    ON c.postId = p.PostId 
WHERE p.content LIKE ? OR p.title LIKE ? 
GROUP BY p.postId 
ORDER BY comms DESC 
LIMIT 100; 
+0

私はこのクエリを使用しても何も表示されません? – SirMaxime

+0

@SirMaxime。 。 。私は、 'where'節にはマッチがないと仮定します。 –

0
SELECT p.postId, p.title, p.postDate, posts.postId, p.content, 
     COUNT(c.commentId) AS comms, 
FROM posts p join 
    comments c 
    ON c.postId = p.PostId 
WHERE p.content LIKE ? OR p.title LIKE ? 
GROUP BY p.postId 
ORDER BY comms DESC 
LIMIT 100; 
0

クエリからusersを削除します。あなたはそれを使用しません:

SELECT COUNT(*) AS comms, comments.postId, comments.commentId, ... 
FROM posts JOIN comments ON posts.postId = comments.postId 
WHERE posts.content LIKE ? OR posts.title LIKE ? 
GROUP BY posts.postId 
ORDER BY comms DESC 
LIMIT 100 
関連する問題