2009-08-24 6 views
0

brauchen Hilfe, wie können wir diese Abfrage kombinieren? ive ein Problem in der Aussage kommen ..mysql kombinieren Abfrage

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 für viel Hilfe .. ich endlich die erste Abfrage ändern zu beseitigen ersten beizutreten. hier ist mein Code kombinieren ...

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

Antwort

3

ein paar Möglichkeiten, aber ich bin mir nicht ganz sicher, was Sie suchen, sie zu kombinieren. Wenn Sie schauen, um nur die Unternehmen zurück, die ein Max-Log-Datum weniger haben als 2009-08-15, können Sie exists verwenden:

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; 

Beachten Sie auch, dass ich coalesce verwendet, um sicherzustellen, werden Sie die null Protokolle zu erfassen.

Nun, wenn Sie das letzte Protokoll Datum sehen möchten:

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 

Wenn Sie dies nur für ein bestimmtes Unternehmen tun wollen, tun:

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 

auf diese Weise, Sie aren‘ t Zurückgeben der gesamten Liste in dieser Unterabfrage.

+0

Ich habe keine Ahnung von existiert. aber es gibt Fehler zurück: # 1064 - Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das Ihrer MySQL-Server-Version für die richtige Syntax entspricht, um 'nears' zu verwenden ( SELECT 1 FROM h_company hc1 LEFT JOIN protokolliert ON (hc1.id_company = 'in Zeile 8 –

+0

@Daniel: vergaß die 'und':) – Eric

+0

ya ich bereits hinzugefügt 'und' aber es gibt kein Ergebnis zurück .. hmm .. ich benutze, um es per Abfrage zu machen und kann es jetzt nicht kombinieren lol –