2

作成中のクエリに問題があります。これは非常に頻繁に発生するテーブル構造のように思われるので、助けていただければ幸いです。

Facebookの構造に似た3つのテーブルがあるとしましょう。UsersWall Posts、およびComments。ユーザーはウォール投稿を作成し、他のウォール投稿にコメントできます。

ユーザーのページで、ユーザーの壁の投稿と、その投稿にあるコメントの数を表示したいと思います。これは私がこれまでに持っているものです

Wall Postテーブルへの内部結合としてユーザー ID を使用してテーブルをクエリしUserます。これにより、そのユーザーのページのウォール投稿の結果セットが得られます。次に、その結​​果セットをループ処理し、各結果セットからウォール ポスト ID を取得して、そのウォール ポスト IDCommentのコメント数をテーブルにクエリします。これは機能しますが、db を 2 回ヒットする必要があります。1 つのクエリでこれを行う方法を考えられる人はいますか?

最初のクエリの例:

SELECT wallPost.*, user.currentDefault, user.displayName, user.userName 
FROM wallPost 
INNER JOIN user ON user.id = wallPost.sourceUserId 
WHERE wallPost.recipientId = ? ORDER BY wallPost.id DESC

2 番目のクエリの例:

SELECT COUNT(id) AS count 
FROM comment 
WHERE wallPostId = ?
4

1 に答える 1

2

カウントをサブクエリとして追加し、サブクエリをメインクエリに結合します

SELECT
    wallPost.*,
    user.currentDefault,
    user.displayName,
    user.userName,
    wallpost_commentcount.total
FROM
    wallPost
        INNER JOIN user ON user.id=wallPost.sourceUserId
        LEFT JOIN (SELECT wallPostId,COUNT(*) as total FROM comment GROUP BY wallPostId) as wallpost_commentcount ON (wallpost_commentcount.wallPostId=wallPost.id)
WHERE
    wallPost.recipientId = ?
ORDER BY wallPost.id DESC

インデックスがあることを確認してくださいcomment.wallPostId。そうしないと、このクエリに長い時間がかかります。

LEFT JOINコメントレコードがまだない場合でも、常にwallPostを取得したいので使用しました

于 2013-03-09T01:28:31.340 に答える