1

質問はこれに似ていますその行に関連するアイテムが別のテーブルに存在するかどうかのフラグを含む一時的な列を返すMySQLクエリを作成する方法

どの行が存在するかをより具体的にする必要があることを除いて

'competitions' と 'competition_entries' の 2 つのテーブルがあります。

大会:

ID    | NAME      | TYPE
--------------------------------
1     | Example   | example type
2     | Another   | example type

コンペティションエントリー

ID    | USERID    | COMPETITIONID
---------------------------------
1     | 100       | 1
2     | 110       | 1
3     | 110       | 2
4     | 120       | 1

コンテストを選択したいのですが、ユーザーがコンテストに参加したかどうかを指定する列を追加します。これは私の現在のSELECTステートメントです

SELECT
    c.[ID],
    c.[NAME],
    c.[TYPE],
    (CASE 
        WHEN e.ID IS NOT NULL AND e.USERID = @userid THEN 1 
        ELSE 0 
        END
    ) AS 'ENTERED'      

FROM competitions AS c
LEFT OUTER JOIN competition_entries AS e
ON e.COMPETITIONID = c.ID

@useridパラメータを設定することによる私の望ましい結果セット110はこれです

ID    | NAME    | TYPE         | ENTERED
-------------------------------------
1     | Example | example type | 1
2     | Another | example type | 1

しかし、代わりに私はこれを得る

ID    | NAME    | TYPE         | ENTERED
-------------------------------------
1     | Example | example type | 0
1     | Example | example type | 1
1     | Example | example type | 0
2     | Another | example type | 1  

すべてのユーザー ID のエントリをカウントしているため

4

1 に答える 1

3

クエリを修正する

SELECT
    c.[ID],
    c.[NAME],
    c.[TYPE],
    MAX(CASE 
        WHEN e.ID IS NOT NULL AND e.USERID = @userid THEN 1 
        ELSE 0 
        END
    ) AS 'ENTERED'      
FROM competitions AS c
LEFT OUTER JOIN competition_entries AS e ON e.COMPETITIONID = c.ID
GROUP BY
    c.[ID],
    c.[NAME],
    c.[TYPE]

別の方法は、EXISTSを使用して書き直すことです。これはほとんど同じですが、理解しやすい場合があります。
ところで、列名に一重引用符を使用することは非推奨です。角かっこを使用します。

SELECT
    c.[ID],
    c.[NAME],
    c.[TYPE],
    CASE WHEN EXISTS (
        SELECT *
        FROM competition_entries AS e
        WHERE e.COMPETITIONID = c.ID
          AND e.USERID = @userid) THEN 1 ELSE 0 END [ENTERED]
FROM competitions AS c
于 2012-10-11T22:19:09.153 に答える