MySQL объединить запрос - PullRequest
0 голосов
/ 24 августа 2009

нужна помощь, как мы можем объединить эти запросы? у меня проблема в операторе соединения ..

SELECT hc.id_company, hc.name, hc.email, dc.country, dc.date_join, 
sum(if(ha.type='ADMIN',1,0)) as ADMIN, 
sum(if(length(ha.type)=6,1,0)) as STAFF, 
sum(if(ha.type='CUST',1,0)) as CUST
from h_company hc, d_company dc 
JOIN h_adminstaffcust ha USING (id_company)
where hc.id_company=dc.id_company
group by id_company;

SELECT max(logs.date)
FROM h_company hc LEFT JOIN logs ON (hc.id_company = logs.id_company)
group by hc.id_company
having max(logs.date)<'2009-08-15';

thx2 за большую помощь .. наконец я изменяю первый запрос, чтобы исключить первое соединение. вот мой код комбайна ...

   SELECT 
   hc.ID_COMPANY, 
   hc.NAME, 
   hc.email,
   (SELECT dc.country FROM d_company dc WHERE hc.ID_COMPANY = dc.ID_Company) as country,
   (SELECT dc.date_join FROM d_company dc WHERE hc.ID_COMPANY = dc.ID_Company) as date_join,
   max(logs.date),
   (SELECT COUNT(ha.ID_COMPANY) FROM h_adminstaffcust ha WHERE hc.ID_COMPANY = ha.ID_Company and TYPE = 'ADMIN') as ADMIN,
   (SELECT COUNT(ha.ID_COMPANY) FROM h_adminstaffcust ha WHERE hc.ID_COMPANY = ha.ID_Company and TYPE = 'CUST') as CUST,
   (SELECT COUNT(ha.ID_COMPANY) FROM h_adminstaffcust ha WHERE hc.ID_COMPANY = ha.ID_Company and length(TYPE)=6) as STAFF
   FROM h_company hc LEFT JOIN logs ON (hc.id_company = logs.id_company)
   GROUP BY hc.ID_COMPANY
   having max(logs.date)<'2009-08-15';

1 Ответ

3 голосов
/ 24 августа 2009

Несколько способов, но я не совсем уверен, что вы ищете, чтобы объединить их. Если вы хотите просто вернуть компании, чья максимальная дата регистрации меньше 2009-08-15, вы можете использовать exists:

SELECT hc.id_company, hc.name, hc.email, dc.country, dc.date_join, 
    sum(if(ha.type='ADMIN',1,0)) as ADMIN, 
    sum(if(length(ha.type)=6,1,0)) as STAFF, 
    sum(if(ha.type='CUST',1,0)) as CUST
from h_company hc, d_company dc 
JOIN h_adminstaffcust ha USING (id_company)
where hc.id_company=dc.id_company
and exists (
    SELECT 1
    FROM h_company hc1 LEFT JOIN logs ON (hc1.id_company = logs.id_company)
    where hc1.id_company = hc.id_company
    group by hc1.id_company
    having coalesce(max(logs.date), '1900-01-01') < '2009-08-15'
)
group by id_company;

Также обратите внимание, что я использовал coalesce, чтобы убедиться, что вы захватываете null журналы.

Теперь, если вы хотите увидеть дату последнего журнала:

SELECT hc.id_company, hc.name, hc.email, dc.country, dc.date_join, 
    sum(if(ha.type='ADMIN',1,0)) as ADMIN, 
    sum(if(length(ha.type)=6,1,0)) as STAFF, 
    sum(if(ha.type='CUST',1,0)) as CUST
from h_company hc, d_company dc 
JOIN h_adminstaffcust ha USING (id_company)
inner join (SELECT hc1.id_company, max(logs.date) as maxdate
    FROM h_company hc1 LEFT JOIN logs ON (hc1.id_company = logs.id_company)
    group by hc1.id_company
    having coalesce(max(logs.date), '1900-01-01') < '2009-08-15')) as logs on
   hc.id_company = logs.id_company
where hc.id_company=dc.id_company

Если вы хотите сделать это только для конкретной компании, выполните:

SELECT hc.id_company, hc.name, hc.email, dc.country, dc.date_join, 
    sum(if(ha.type='ADMIN',1,0)) as ADMIN, 
    sum(if(length(ha.type)=6,1,0)) as STAFF, 
    sum(if(ha.type='CUST',1,0)) as CUST
from h_company hc, d_company dc 
JOIN h_adminstaffcust ha USING (id_company)
inner join (SELECT hc1.id_company, max(logs.date) as maxdate
    FROM h_company hc1 LEFT JOIN logs ON (hc1.id_company = logs.id_company)
    where hc1.id_company = 1245 --Add where clause here
    group by hc1.id_company
    having coalesce(max(logs.date), '1900-01-01') < '2009-08-15')) as logs on
   hc.id_company = logs.id_company
where hc.id_company=dc.id_company

Таким образом, вы не возвращаете весь список в этом подзапросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...