2009-08-24 91 views
0

需要幫助,我們如何結合這些查詢?香港專業教育學院的一個問題在連接語句..mysql組合查詢

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'; 

回答

3

的幾種方法,但我不完全知道你在找什麼把它們結合起來。如果你正在尋找剛剛返回的有一個最大日誌日期小於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 

這樣一來,你不是活得t返回該子查詢中的整個列表。

+0

我沒有任何關於存在的想法。但它返回錯誤: #1064 - 您的SQL語法有錯誤; ( SELECT 1 FROM h_company hc1 LEFT JOIN登錄(hc1.id_company ='在第8行 – 2009-08-24 04:09:13

+0

@Daniel:忘記了'和': ) – Eric 2009-08-24 04:19:07

+0

雅我已經添加了'和'但它返回零結果..嗯..即時通訊使用它使每個查詢,現在不能結合它大聲笑 – 2009-08-24 04:21:30