1

COALESCEを使用すると、次のようにcomment_votesという一時変数を作成できます。

SELECT comments.*, COALESCE(rs_reputations.value, 0) AS comment_votes FROM `comments` 
LEFT JOIN rs_reputations ON comments.id = rs_reputations.target_id AND 
rs_reputations.target_type = 'Comment' AND rs_reputations.reputation_name = 
'comment_votes' AND rs_reputations.active = 1 WHERE (impression_id = 1)

来たクエリでimpression_votesという2番目の変数を作成したいと思います。私はこれを次のように試みました:

SELECT comments.*, COALESCE(rs_reputations.value, 0) AS comment_votes 
FROM 'comments' 
    LEFT JOIN rs_reputations ON 
        comments.id = rs_reputations.target_id AND 
        rs_reputations.target_type = 'Comment' AND 
        rs_reputations.reputation_name = 'comment_votes' AND 
        rs_reputations.active = 1 
SELECT comments.*, COALESCE(rs_reputations.value, 0) AS impression_votes 
FROM 'comments' 
    LEFT JOIN rs_reputations ON 
    comments.id = rs_reputations.target_id AND
    rs_reputations.target_type = 'Comment' AND
    rs_reputations.reputation_name = 'impression_votes' AND 
    rs_reputations.active = 1 
WHERE

これにより、エラーが発生します。

You have an error in your SQL syntax

私が試みていることは可能でさえありますか?もしそうなら、私は2つのSELECT/COALESCEステートメントを不適切にブリッジしているようです。これはどのように書くべきですか?

4

1 に答える 1

2

MySQL COALESCE関数は、実際にはnull以外の最初の値を返す組み込み関数です。これは変数ではなく、さまざまなデータベースシステムで実際にサポートされている関数です。

たとえば、次の表を使用します。

| Id    | Name      | Counter    |
| 1     | lolcat    | NULL       |
| 2     | codez     | 1          |

SQLステートメント:

SELECT Id, Name, COALESCE(counter, 0) AS NonNullCounter FROM table

結果を返します:

| Id    | Name      | NonNullCounter |
| 1     | lolcat    | 0              |
| 2     | codez     | 1              |

この場合、NULL値は0に置き換えられています。

これは、コメント内の行のrs_reputationsに一致する行がまだない場合、列に戻り、LEFT JOINその後に。に置き換えられるため、便利です。NULLrs_repuations.value0COALESCE

JOINを初めて使用する場合は、JeffAtwoodによる優れたビジュアルガイドがあります。

最初のクエリは実際には次のようになります。

SELECT     comments.*, 
           COALESCE(rs_reputations.value, 0) AS comment_votes 
FROM       comments 
LEFT JOIN   rs_reputations ON comments.id = rs_reputations.target_id 
                           AND rs_reputations.reputation_name = 'comment_votes' 
WHERE       impression_id = 1;

選択1-ユニオン

いくつかの選択肢があります。次のように、結果をまとめてUNIONすることができます。

SELECT     comments.*, 
           COALESCE(rs_reputations.value, 0) AS votes,
           'comment_votes' AS vote_type 
FROM       comments 
LEFT JOIN   rs_reputations ON comments.id = rs_reputations.target_id 
                           AND rs_reputations.reputation_name = 'comment_votes' 
WHERE       impression_id = 1

UNION

SELECT     comments.*, 
           COALESCE(rs_reputations.value, 0) AS votes,
           'impression_votes' as vote_type 
FROM       comments 
LEFT JOIN   rs_reputations ON comments.id = rs_reputations.target_id 
                           AND rs_reputations.reputation_name = 'impression_votes' 
WHERE       impression_id = 1;

この場合、結果は次のようになります。

|comments_columns|votes|vote_type       |
| *              |12   |comment_vote    |
| *              |2    |impression_vote |  

選択肢2-同じテーブルに2回参加する

または、同じテーブル名で異なるエイリアスを使用して、同じテーブルに2回自己結合することもできます。

SELECT     comments.*, 
           COALESCE(CommentRep.value, 0) AS comment_votes,
           COALESCE(ImpressionRep.value, 0) AS impression_votes,
FROM       comments 
LEFT JOIN   rs_reputations AS CommentRep ON comments.id = CommentRep.target_id 
                           AND CommentRep.reputation_name = 'comment_votes' 
LEFT JOIN   rs_reputations AS ImpressionRep ON comments.id = ImpressionRep.target_id 
                           AND ImpressionRep.reputation_name = 'impression_votes'
WHERE       CommentRep.impression_id = 1
AND         ImpressionRep.impression_id = 1

この場合、結果は次のようになります。

|comments_columns|comment_votes|impression_votes|
| *              |12           |0               |
| *              |2            |6               |  

最後に(おい)元のSQLでエラーが発生する理由は、2つのSELECTステートメントを実際に関連付けずにチェーンしているためです。この場合、SQLは論理的に関連付ける必要があるため、実際には意味がありません。 UNIONまたは上記の繰り返し結合。

于 2012-10-17T22:57:08.287 に答える