2016-08-03 47 views
0

我想做一个嵌套的选择,但不同的表。这里是我的查询:从不同的表嵌套选择

SELECT contact_profile.name, main_app.fk_lkp_app, main_app.id as main_id, 
(
    -- if the main_app.fk_lkp_app value is 1 then do this 
    SELECT SUM(translation_app.amount) 
    FROM translation_app 
    WHERE translation_app.fk_main_app = main_app.id 
    AND translation_app.status = 2 
    AND main_app.srf_number is not null 
    AND main_app.fk_invoice is not null 

    -- if the main_app.fk_lkp_app value is 2 then do this 
    SELECT SUM(interpretation_app.amount) 
    FROM interpretation_app 
    WHERE interpretation_app.fk_main_app = main_app.id 
    AND interpretation_app.status =2 
    AND main_app.srf_number is not null 
    AND main_app.fk_invoice is not null 

    -- if the main_app.fk_lkp_app value is 3 then do this 
    SELECT SUM(course_app.amount) 
    FROM course_app 
    WHERE course_app.fk_main_app = main_app.id 
    AND course_app.status =2 
    AND main_app.srf_number is not null 
    AND main_app.fk_invoice is not null 
) as amount 
FROM contact_profile 
LEFT JOIN main_app ON main_app.fk_contact_profile = contact_profile.id 
WHERE main_app.fk_lkp_app in (1,2,3) 
AND main_app.srf_number is not null 
AND main_app.fk_invoice is not null 
GROUP BY contact_profile.name 
ORDER BY amount DESC 

正如你所看到的,“量”字段基于main_app.fk_lkp_app值不同的表中选择。问题是如何做这个查询的最佳方法?我坚持使用“main_app.fk_lkp_app”值参数部分。

我甚至使用CASE尝试作为建议,但它不断给我的错误代码#1064

SELECT contact_profile.name, main_app.fk_lkp_app, main_app.id as main_id, 
(
CASE 
    WHEN main_app.fk_lkp_app = '1' 
    THEN ( 
     SELECT SUM(translation_app.amount) 
     FROM translation_app 
     WHERE translation_app.fk_main_app = main_app.id 
    ) 
    WHEN main_app.fk_lkp_app = '2' 
    THEN (
     SELECT SUM(interpretation_app.amount) 
     FROM interpretation_app 
     WHERE interpretation_app.fk_main_app = main_app.id 
    ) 
    WHEN main_app.fk_lkp_app = '3' 
    THEN (
     SELECT SUM(course_app.amount) 
     FROM course_app 
     WHERE course_app.fk_main_app = main_app.id 
    ) 
    ELSE 0 
END CASE 
) as amount 
FROM contact_profile 
LEFT JOIN main_app ON main_app.fk_contact_profile = contact_profile.id 
WHERE main_app.fk_lkp_app in (1,2,3) 
AND main_app.srf_number is not null 
AND main_app.fk_invoice is not null 
GROUP BY contact_profile.name 
ORDER BY amount DESC 

奇怪的是,如果我不使用的情况下,仅使用1从3变体中(例如:我只从translation_app表中选择)查询正在工作。

+0

根据您的查询,嵌套的选择结果对于主要查询的输入而言不是必需的,因此您需要将这些嵌套的查询转换为加入。 –

+0

你可以使用'CASE'吗? –

+0

我该如何做到这一点?我可以加入,但不同的main_app.fk_lkp_app价值要求困扰着我。 – IkouKuhn

回答

1

你可以使用CASE表达

http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case

检查main_app.fk_lkp的价值,并执行基于该value.I查询无法测试,但这样的事情应该工作

SELECT contact_profile.name, main_app.fk_lkp_app, main_app.id as main_id, 
CASE 
    WHEN main_app.fk_lkp_app = 1 THEN (/* your query here */) 
    WHEN main_app.fk_lkp_app = 2 THEN (/* your query here */) 
    WHEN main_app.fk_lkp_app = 2 THEN (/* your query here */) 
    ELSE 0 
END AS amount .... 
+0

看来你已经更新了你的答案。 我试过更新版本,它的工作原理!谢谢! – IkouKuhn