2012-07-18 67 views
0

我的SQL语句看起来像这样想不通的MySQL声明

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) 

其实我想弄清楚1,仅在MySQL声明从以下(我试过在人类的语言来解释))

如果uqa.question_id不为0(或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_id不为0(或NULL),但uqa.question_id是0,那么

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

如果uqa.course_id不为0(或NULL),但uqa.question_iduqa.lesson_id是0,那么

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

有什么建议? THX提前

回答

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或MS SQL进行

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 
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=?