1

次の行の質問というテーブルがあります。

questions.id | questions.target_username
   1         | every.one
   2         | every.one

次の行の回答テーブルもあります。

answers.id | answers.username       
   1       | guy
   1       | maricela 
   2       | mikha 

ご覧のとおり、同じ質問IDに異なるユーザーからの回答が含まれている可能性があります。次の場合にのみ行を選択したい:

a)質問には、answers.usernameとして(mikha)を含まない回答があり、この場合、質問IDを1回だけ表示します

b)質問には、answers.usernameとして回答ユーザー名(mikha)があります。

次のクエリを使用します。

SELECT questions.id, answers.username
FROM questions
LEFT JOIN answers ON ( questions.id = answers.id ) 
WHERE questions.target_username =  'every.one'
AND (
answers.username IS NOT NULL 
OR answers.username =  'mikha'
)
GROUP BY questions.id, answers.username

私が期待する結果:

questions.id | answers.usernme
   1         |  
   2         | mikha

私が実際に得るもの:

questions.id | answers.usernme
   1         | guy
   1         | maricela  
   2         | mikha

よろしくミカヘル

4

4 に答える 4

3

条件をon句に移動するだけanswers.username = 'mikha'で、その時点で冗長なwhere条件を削除することもできます。

SELECT questions.id, answers.username
FROM questions
LEFT JOIN answers ON(questions.id = answers.id AND answers.username = 'mikha')
WHERE questions.target_username = 'every.one'
GROUP BY questions.id, answers.username;

編集:これが要件であるかどうかはわかりませんが、まだ誰も回答していない質問を省略したい場合は、次のようにします。

SELECT questions.id, answers.username
FROM questions
LEFT JOIN answers ON(questions.id = answers.id AND answers.username = 'mikha')
LEFT JOIN answers others ON(questions.id = others.id AND others.username <> 'mikha')
WHERE questions.target_username = 'every.one'
AND (
    (
        answers.id IS NOT NULL
        AND others.id IS NULL
    )
    OR (
        answers.id IS NULL
        AND others.id IS NOT NULL
    )
)
GROUP BY questions.id, answers.username;

編集2:テストテーブルにあるものとクエリ#2の結果は次のとおりです。

SELECT * FROM questions;
+----+-----------------+
| id | target_username |
+----+-----------------+
|  1 | every.one       |
|  2 | every.one       |
|  3 | every.one       |
|  4 | every.one       |
+----+-----------------+
4 rows in set (0.00 sec)

SELECT * FROM answers;
+-----+----+----------+
| ida | id | username |
+-----+----+----------+
|   1 |  1 | guy      |
|   2 |  1 | maricela |
|   3 |  2 | mikha    |
+-----+----+----------+
3 rows in set (0.00 sec)

(Run query #2 above)
+----+----------+
| id | username |
+----+----------+
|  1 | NULL     |
|  2 | mikha    |
+----+----------+
2 rows in set (0.00 sec)

編集3:コメントで追加した基準に準拠する更新されたテーブルデータと更新されたクエリは次のとおりです。

SELECT * FROM questions;
+----+-----------------+
| id | target_username |
+----+-----------------+
|  1 | every.one       |
|  2 | every.one       |
|  3 | every.one       |
|  4 | every.one       |
+----+-----------------+
4 rows in set (0.00 sec)

SELECT * FROM answers;
+-----+----+----------+
| ida | id | username |
+-----+----+----------+
|   1 |  1 | guy      |
|   2 |  1 | maricela |
|   3 |  2 | mikha    |
|   7 |  4 | guy      |
|   8 |  4 | mikha    |
+-----+----+----------+
5 rows in set (0.00 sec)

新しいクエリ:

SELECT questions.id, answers.username
FROM questions
LEFT JOIN answers ON(questions.id = answers.id AND answers.username = 'mikha')
LEFT JOIN answers others ON(questions.id = others.id AND others.username <> 'mikha')
WHERE questions.target_username = 'every.one'
AND (
    answers.username = 'mikha'
    OR (
        answers.id IS NULL
        AND others.id IS NOT NULL
    )
)
GROUP BY questions.id, answers.username;

結果:

+----+----------+
| id | username |
+----+----------+
|  1 | NULL     |
|  2 | mikha    |
|  4 | mikha    |
+----+----------+
3 rows in set (0.00 sec)
于 2012-12-07T17:58:04.727 に答える
0

あなたはあなたの答えの表を変更する必要があります、

answer.Idをquestion.Idに変更し、answer.Idを主キーとして追加します。

あなたが期待する結果は2行目であるため、目的は明確ではありません。mikha(ユーザー名がmikhaの場合、質問IDのみが必要です)?

于 2012-12-07T17:20:34.837 に答える
0

回答IDに参加する場合は、「mikha」であるユーザー名のみを使用すると、目的の結果が得られるはずです。回答はあるがmikhasの回答はないIDはnull値を取得します。この情報を取得するために質問テーブルが必要な場所がわかりませんでした。

SELECT answers.id, a2.username
FROM answers
LEFT JOIN (
   SELECT id, username
   FROM answers
   WHERE username = 'mikha'
) AS a2 ON a2.id = answers.id
GROUP BY answers.id
于 2012-12-07T17:29:41.657 に答える
0

この結果が得られる理由は次のとおりです。

  1. answers.username IS NOT NULL OR answers.username = 'mikha'状態が悪いです。2番目のケースanswers.username = 'mikha'は、すでにanswers.username IS NOT NULL-したがって、意味のない2番目の条件付きの状況です。
  2. 、をこのLEFT JOIN条件で追加すると、基本的にはと同等になりますINNER JOIN
于 2012-12-07T17:42:29.817 に答える