0

私のタイトルがそれをうまく説明しているかどうかわからないので、ここに例を示します。フィールド comment_id に基づいて一致する 2 つの MYSQL テーブル、comments と votes_comments があります。サンプル データのコメントには 2 つの行があり、votes_comments にはコメント行の 1 つに一致する 1 つの行があります。AKA 2 つのコメントが書き込まれ、1 人のユーザーがそのうちの 1 つに投票したことを考えると、次のクエリは 2 行を返します。

SELECT comments.*, users.username FROM comments 
JOIN users ON users.user_id = comments.user_id 
WHERE comments.track_id=6 AND comments.parent_id=-1
GROUP BY comments.comment_id

今私がやりたいことは、一致する行がある場合とない場合がある votes_comments に参加することです。私がやりたいことは、一致する値が存在する場合はそれを取得するか、一致する結果がない場合は列に null を返すことです。AKA: ユーザーが賛成票を投じたか、反対票を投じたか、まったく投票しなかったか (null)。ここに私の変更されたクエリがあります:

SELECT comments.*, users.username, votes_comments.vote FROM comments 
JOIN users ON users.user_id = comments.user_id 
LEFT JOIN votes_comments ON votes_comments.comment_id = comments.comment_id
WHERE track_id=6 AND parent_id=-1 AND votes_comments.user_id=1
GROUP BY comments.comment_id

votes_comments には 1 行しかないため、このクエリは 1 行しか返しません。左結合は希望どおりの結果を返すと思っていましたが、明らかにそうではありませんでした。私が探しているものを取得する方法はありますか?

4

2 に答える 2

1

WHEREこの条項AND votes_comments.user_id=1が問題を引き起こしているのではないかと思います。

結合に関するチュートリアルを読むと、 の結果がLEFT JOIN2 つの行を持つ一時テーブルであり、各行に fromcomments JOIN usersと fromのフィールドがあることがわかりますvotes_comments。一致するレコードがvotes_comments存在しない場合、一時テーブルのフィールドにNULL値が入力されます。

句はWHERE、の行に一致するレコードAND votes_comments.user_id=1がないため、失敗します。votes_comments.user_idNULLuservotes_comments

実際に必要なのはvotes_comments、特定のユーザー ID (例: ID=1) に一致する行に結合することである場合、ON句は次のようになります。

ON votes_comments.comment_id = comments.comment_id
    AND votes_comments.user_id=1
于 2012-04-10T06:45:01.550 に答える
0

両方のテーブルから行を取得したい場合は、 の使用を検討してFULL OUTER JOINください。このような:

SELECT comments.*, users.username, votes_comments.vote FROM comments 
JOIN users ON users.user_id = comments.user_id 
FULL OUTER JOIN votes_comments ON votes_comments.comment_id = comments.comment_id
AND votes_comments.user_id=1
WHERE track_id=6 AND parent_id=-1 
GROUP BY comments.comment_id

編集

申し訳ありません。ここここFULL OUTER JOINでそれについてもっと読むことができます

于 2012-04-10T06:30:11.980 に答える