2011-09-16 36 views
3

简单地说:我希望在CASE语句的'THEN'部分之后放置子查询,它将返回不止一行。这可能吗?更多细节如下:MySQL Case语句,在'语句列表'中返回的多行行(Then Then ...之后的部分)

我正在寻找一种方法来从CASE语句中取回多行,即使我的SELECT语句中的其他字段只返回一行。我不断收到'子查询返回多行'。这就是我想要的!

表:

courses 
------- 
course_id, fksubject_id; 

course_reports 
-------------- 
course_reports_id, fkcourse_id, is_finished, timestamp; 

course_reports_answers 
---------------------- 
course_reports_answers_id, fkcourse_reports_id, fkquestion_id, answer1, answer2, answer3 

QUERY:

SELECT 
    cr.course_reports_id, 
    CASE WHEN c.fksubject_id = 1 THEN (SELECT fkquestion_id from course_reports_answers WHERE fkcourse_reports_id = 1) ELSE NULL END AS 'fkquestion_id' 
FROM 
courses c 
join course_reports cr on cr.fkcourse_id = c.course_id 
join course_reports_answers cra on cra.fkcourse_reports_id = cr.course_reports_id 

所以,因为有每course_report_id多fkquestion_ids,期望的结果是:

1 1 
1 2 
1 3 
1 4 
1 5 
etc. 

同样,我越来越'子查询返回多行。'

我想重复一个值,并将其与不同的值配对,创建多行。我认为我以前做过这件事,但是我很难找到我过去的问题,或者弄清楚我现在正在做什么。注意:这个SELECT最终将用于填充插入语句。任何帮助是极大的赞赏!

+0

所以,如果课程主题ID不是1,做你想要它返回呢? – itsmatt

+0

实际上,对于每个可能的subject_id,真正的查询都会有类似的情况,并且where子句中会有一些参数限制结果。我认识到(现在)它在示例中的写法可能会提供一堆NULL行,但在真正的查询中不会这样(我无法提供,因为它适用于我的雇主)。 –

回答

1

尝试

SELECT 
    cr.course_reports_id, 
    Z.fkquestion_id 
FROM 
courses c 
join course_reports cr on cr.fkcourse_id = c.course_id 
join course_reports_answers cra on cra.fkcourse_reports_id = cr.course_reports_id 
left outer join (SELECT cc.course_id, a.fkquestion_id from course_reports_answers a, courses cc WHERE cc.fksubject_id = 1 and a.fkcourse_reports_id = 1) Z on c.course_id = Z.course_id 
+0

谢谢,我正在尝试这个版本,但我必须将其翻译回我的实际名称。子查询中带有fkcourse_reports_id = 1的部分是按设计进行的。基本上,我想复制一组模型答案(fkcourse_reports_id = 1中的答案)的所有答案,并将它们与不同的course_report_ids放在一起。 –

+0

太棒了!我认为这可能对我有用。现在我必须为每个subject_id进行左外连接,并在SELECT中使用case语句来获取正确的连接,但我认为它正在工作。 –

+0

很高兴它的工作原理:-)请不要忘记将upvote/mark标记为接受任何有帮助的答案。 – Yahia