0

私のSQLステートメントは次のようになります

SELECT q.content 
FROM questions AS q, user_question_assoc AS uqa 
WHERE uqa.user_id=? AND (q.course_id = uqa.course_id 
OR q.lesson_id=uqa.lesson_id
OR q.question_id=uqa.question_id)

ステートメントの最後の部分は私が必要とするものではありません

WHERE uqa.user_id=? AND (q.course_id = uqa.course_id 
    OR q.lesson_id=uqa.lesson_id
    OR q.question_id=uqa.question_id) 

実際、私は以下から唯一のMySQLステートメントを理解したいと思います(私は人間の言語で説明しようとしました))

uqa.question_id0(またはNULL)でない場合は、

WHERE uqa.user_id=? AND (q.course_id = uqa.course_id 
        AND q.lesson_id=uqa.lesson_id
        AND q.question_id=uqa.question_id) 

uqa.lesson_id0(またはNULL)ではなく0の場合uqa.question_id

WHERE uqa.user_id=? AND (q.course_id = uqa.course_id 
        AND q.lesson_id=uqa.lesson_id)

uqa.course_id0(またはNULL)ではなくuqa.question_iduqa.lesson_id0の場合

WHERE uqa.user_id=? AND q.course_id = uqa.course_id
4

3 に答える 3

1

次のような場合にユースケースを使用できると思います。

WHERE (CASE WHEN xx is not null then xid when yyx is null the yid end) = (CASE WHEN ww is null then someother id else id end)

MySQLの構文はわかりませんが、これがOracleまたはMSsqlで実行できる方法です。

于 2012-07-18T14:49:12.797 に答える
1

ORこの句を使用すると、MySQLなどの一部のデータベースはインデックスを使用しません。代わりに使用UNIONすると、大きなテーブルでパフォーマンスが大幅に向上する可能性があります。

SELECT
    1 AS id,
    q.content 
FROM 
    questions AS q
INNER JOIN
    user_question_assoc AS uqa ON 
        q.course_id   = uqa.course_id AND
        q.lesson_id   = uqa.lesson_id AND
        q.question_id = uqa.question_id
WHERE 
    uqa.user_id     = ? AND
    uqa.question_id <> 0
UNION
SELECT 
    2 AS id,
    q.content 
FROM 
    questions AS q
INNER JOIN
    user_question_assoc AS uqa ON 
        q.course_id   = uqa.course_id AND
        q.lesson_id   = uqa.lesson_id
WHERE 
    uqa.user_id     = ? AND
    uqa.question_id = 0
UNION
SELECT 
    3 AS id,
    q.content 
FROM 
    questions AS q
INNER JOIN
    user_question_assoc AS uqa ON 
        q.course_id   = uqa.course_id
WHERE 
    uqa.user_id     = ? AND
    uqa.question_id = 0 AND
    uqa.lession_id  = 0
于 2012-07-18T14:49:51.820 に答える
1

まず、適切な結合構文を使用してこれを行う必要があります。

SELECT q.content
FROM questions q join
     user_question_assoc uqa
     on (q.course_id = uqa.course_id OR
         q.lesson_id=uqa.lesson_id OR
         q.question_id=uqa.question_id) 
WHERE uqa.user_id=?

これを試してください:

SELECT q.content
FROM questions q join
     user_question_assoc uqa
     on q.course_id = uqa.course_id AND
        (q.lesson_id=uqa.lesson_id OR coalesce(uqa.lesson_id, 0) = 0) AND
        (q.question_id=uqa.question_id or coalesce(uqa.question_id, 0) = 0) 
WHERE uqa.user_id=?
于 2012-07-18T14:51:03.147 に答える