2013-07-29 5 views
2

Я не знаю, возможно ли это, но я пытаюсь сделать выборные запросы с помощью пары JOINS с инструкцией WHERE. Мне нужно поле, основанное на конкретном ГДЕ и другом поле с разными ГДЕ.Sub-Select на MySQL

Текущий SQL запрос:

SELECT SUM(a.totaltime), b.user_name, MONTHNAME(a.date) 
FROM a 
JOIN c on c.id = a.id                  
JOIN b on b.userid = c.userid  
LEFT JOIN d on a.projid = d.projectid                  
LEFT JOIN e on a.account_id = e.salesorderid               
LEFT JOIN f on e.salesorderid = f.salesorderid              
LEFT JOIN g on d.projectid = g.projectid                  
WHERE c.deleted != "1" AND YEAR(DATE(NOW())) AND (f.cf_991 = '1' OR g.cf_990 = '1') 
group by user_name,MONTHNAME(a.date); 

Это прекрасно работает, но мне нужно, чтобы включить еще одно поле на этот раз КУДА будет:

WHERE c.deleted != "1" AND YEAR(DATE(NOW())) AND (f.cf_991 = '0' OR g.cf_990 = '0') 

Любая помощь очень ценится благодаря

EDIT:

ТЕКУЩИЙ ВЫХОД:

total_time  username  MONTHNAME(a.date) 
22.5    admin   April 
21    admin   June 
15    max    April 

Так выше, основана на f.cf_991 = '1' OR g.cf_990 = '1'

Что мне нужно это:

total_time  username  MONTHNAME(a.date)  total_time_2 
22.5    admin   April     5 
21    admin   June      9 
15    max    April     13 

total_time_2 основана на ф. cf_991 = '0' ИЛИ ​​g.cf_990 = '0'.

+0

«Мне нужно включить еще одно поле на этот раз WHERE будет» что вы имеете в виду? –

+0

т. Е. Вместо выдачи другого запроса с другим, где мне нужен другой столбец на основе другого WHERE – kiki90

+3

'И ГОД (DATE (NOW())) - что это делает? –

ответ

3
SELECT SUM(CASE WHEN f.cf_991 = '1' OR g.cf_990 = '1' THEN a.totaltime END) as total_time 
, b.user_name, MONTHNAME(a.date) 
, SUM(CASE WHEN f.cf_991 = '0' OR g.cf_990 = '0' THEN a.totaltime END) as total_time_2 
FROM a 
JOIN c on c.id = a.id                  
JOIN b on b.userid = c.userid  
LEFT JOIN d on a.projid = d.projectid                  
LEFT JOIN e on a.account_id = e.salesorderid               
LEFT JOIN f on e.salesorderid = f.salesorderid              
LEFT JOIN g on d.projectid = g.projectid                  
WHERE c.deleted != "1" 
AND YEAR(CURDATE()) = a_column_containing_a_date 
AND (
     (f.cf_991 = '1' OR g.cf_990 = '1') 
    OR 
     (f.cf_991 = '0' OR g.cf_990 = '0') 
    ) 
group by user_name,MONTHNAME(a.date); 
+0

Есть дополнительный кронштейн на YEAR ((CURDATE()) должен быть YEAR (CURDATE()), но это потрясающе, это работает !!: D спасибо – kiki90

+0

Правильно, исправил. Добро пожаловать. – fancyPants

0

Просто попробуйте этот

SELECT 
SUM(if(f.cf_991 = '1' || g.cf_990 = '1',a.totaltime,0)), 
SUM(if(f.cf_991 = '0' || g.cf_990 = '0',a.totaltime,0)), 
b.user_name, MONTHNAME(a.date) FROM a 
JOIN c on c.id = a.id 
JOIN b on b.userid = c.userid 
LEFT JOIN d on a.projid = d.projectid 
LEFT JOIN e on a.account_id = e.salesorderid 
LEFT JOIN f on e.salesorderid = f.salesorderid 
LEFT JOIN g on d.projectid = g.projectid 
WHERE c.deleted != "1" AND YEAR(DATE(NOW())) 
and ((f.cf_991 = '1' OR g.cf_990 = '1') or(f.cf_991 = '0' OR g.cf_990 = '0')) 
group by ser_name,MONTHNAME(a.date);