5

この質問が何度も出されたことは知っています (ただし、解決策はまだ見つかりませんでした)。

基本的な質問: テーブルpostscommentsuser ... を 1 つの select ステートメントで選択して、すべての投稿とすべてのコメント (comment.user、comment.text、comment.timestamp を使用) を表示できますか? そのような select ステートメントはどのようになりますか? そうでない場合、最も簡単な解決策は何ですか?

私もtable を使用しJOINcommentsテーブルを試してみましたが、各行に 1 つのコメントしかないか、各コメントだけでなく、それらの投稿も複数回取得しました!?postsGROUP BY

最初のリンク (ネストされた mysql_query とフェッチ) と 2 番目のリンク (配列を使用) の解決策を試しました。ただし、最初は一連のエラーが発生し(その投稿の構文は正しくないようで、解決方法がわかりませんでした)、2番目は配列に問題がありました。

私のクエリは今まで次のようになっています。

SELECT p.id, p.title, p.text, u.username, c.country_name, (SELECT SUM(vote_type) FROM votes v WHERE v.post_id = p.id) AS sum_vote_type FROM posts p LEFT JOIN user u ON ( p.user_id = u.id ) LEFT JOIN countries c ON ( c.country_id = u.country_id ) ORDER BY $orderby DESC

投稿やコメントを表示することで、この問題はあまり一般的ではないのではないかと思っていました...?

事前にご協力いただきありがとうございます。

4

1 に答える 1

10

データベースの構造がわからない場合は、次のようになります。*文字を、実際に必要な列のより明示的なリストに置き換える必要があることに注意してください。

SELECT p.*, c.*, u.* FROM posts p
LEFT JOIN comments c ON c.post_id = p.id
LEFT JOIN users u ON u.id = p.author_id

カウントや合計などを取得しようとしているだけの場合は、その情報の一部をキャッシュすることをお勧めします。たとえば、クエリごとにコメント数をカウントするのではなく、投稿テーブルにコメント数をキャッシュしたい場合があります。コメントを追加/削除するときは、コメント数のみをカウントして更新してください。

編集: 各コメントにユーザーデータも添付したいことに気づきました。同じテーブルに複数回参加できますが、見苦しくなります。これは非常に高価なクエリになる可能性があります。混乱を少なくするために、列のエイリアスを作成する方法の例も含めています。

SELECT p.*, c.*, u.name as post_author, u2.name as comment_author FROM posts p
LEFT JOIN comments c ON c.post_id = p.id
LEFT JOIN users u ON u.id = p.author_id
LEFT JOIN users u2 ON u2.id = c.author_id
于 2012-04-20T22:37:27.177 に答える