2013-12-20 3 views
0

Нужно выбрать два столбца из двух разных наборов таблиц.mysql query select два столбца каждый из двух разных наборов таблиц

Сейчас у меня есть это как два разных запросов, но хотел бы знать, если есть способ, чтобы это в одном запросе

Query-1

SELECT  
     BSM, DATE, HOUR, SUM(t.ATT), SUM(t.AVG_HLD) 
    FROM (
     SELECT BSM, DATE, HOUR, ATT, AVG_HLD FROM t1 WHERE ".$whereCondition." UNION ALL 
     SELECT BSM, DATE, HOUR, ATT, AVG_HLD FROM t2 WHERE ".$whereCondition." 
     ) t 
    GROUP BY BSM, DATE, HOUR "; 

Query-2

SELECT  
     BSM, DATE, HOUR, SUM(s.M_ATT), SUM(s.M_AVG_HLD) 
    FROM (
     SELECT BSM, DATE, HOUR, M_ATT, AVG_HLD FROM t3 WHERE ".$whereCondition." UNION ALL 
     SELECT BSM, DATE, HOUR, M_ATT, AVG_HLD FROM t4 WHERE ".$whereCondition." 
     ) s 
    GROUP BY BSM, DATE, HOUR "; 

Как совместить оба запроса-1 и Query-2 как ...

SELECT  
     BSM, DATE, HOUR, SUM(s.ATT), SUM(s.AVG_HLD), SUM(s.M_ATT), SUM(s.M_AVG_HLD) 
    FROM (
     ** Whatever it is ** 
     ) 
    GROUP BY BSM, DATE, HOUR "; 
+0

Для простоты, я бы удалить немного PHP для теперь – Strawberry

ответ

3

Сделать UNION всех 4 подзапросов, вставив 0 столбцов для столбцов, которые приходят из другой пары таблиц.

SELECT BSM, DATE, HOUR, SUM(ATT) AS ATT, SUM(AVG_HLD) AS AVG_HLD, SUM(M_ATT) AS M_ATT, SUM(M_AVG_HLD) AS M_AVG_HLD 
FROM (
     SELECT BSM, DATE, HOUR, ATT, AVG_HLD, 0 AS M_ATT, 0 AS M_AVG_HLD FROM t1 WHERE ".$whereCondition." 
     UNION ALL 
     SELECT BSM, DATE, HOUR, ATT, AVG_HLD, 0 AS M_ATT, 0 AS M_AVG_HLD FROM t2 WHERE ".$whereCondition." 
     UNION ALL 
     SELECT BSM, DATE, HOUR, 0 AS ATT, 0 AS AVG_HLD, M_ATT, M_AVG_HLD FROM t3 WHERE ".$whereCondition." 
     UNION ALL 
     SELECT BSM, DATE, HOUR, 0 AS ATT, 0 AS AVG_HLD, M_ATT, M_AVG_HLD FROM t4 WHERE ".$whereCondition." 
    ) u 
GROUP BY BSM, DATE, HOUR 
+0

спасибо Barmar. Но угадайте, что порядок столбцов должен быть одинаковым по подзапросам. иначе im получает значение 0 для столбца M_ATT. Я прав? – Siva

+1

Правильно, я сделал несколько ошибок при вырезании и вставке. Исправлено. – Barmar

+0

Как я могу однозначно отсылать столбцы ATT от t1 и t2 отдельно? что-то вроде этого: SELECT BSM, DATE, HOUR, SUM (t1.ATT) AS t1ATT, SUM (t2.ATT) AS t2.ATT ... ' – Siva

1

Вы также можете попробовать это так

SELECT bsm, date, hour, 
     SUM(CASE WHEN src = 1 THEN att END) att, 
     SUM(CASE WHEN src = 1 THEN att_hld END) att_hld, 
     SUM(CASE WHEN src = 2 THEN att END) m_att, 
     SUM(CASE WHEN src = 2 THEN att_hld END) m_att_hld 
FROM 
(
    SELECT 1 src, bsm, date, hour, att, avg_hld FROM t1 WHERE ".$whereCondition." UNION ALL 
    SELECT 1 src, bsm, date, hour, att, avg_hld FROM t2 WHERE ".$whereCondition." UNION ALL 
    SELECT 2 src, bsm, date, hour, m_att, avg_hld FROM t3 WHERE ".$whereCondition." UNION ALL 
    SELECT 2 src, bsm, date, hour, m_att, avg_hld FROM t4 WHERE ".$whereCondition." 
) t 
GROUP BY bsm, date, hour; 
+0

Могу ли я переписать этот 'SUM (CASE WHEN src = 1 THEN att END) att' как' ROUND (SUM (CASE WHEN src = 1 THEN att + att_hld * 100 END), 2) att' ??? – Siva

Смежные вопросы