2009-08-24 7 views
0

besoin d'aide, comment pouvons-nous combiner ces requête? ive un problème dans la déclaration .. joindremysql combiner requête

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 aide beaucoup .. enfin je modifie la première requête d'éliminer d'abord rejoindre. ici est mon code ... moissonneuse-batteuse

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

Répondre

3

Quelques façons, mais je ne suis pas tout à fait sûr de ce que vous cherchez à les combiner. Si vous cherchez à retourner simplement les entreprises qui ont une date de log max moins de 2009-08-15, vous pouvez utiliser 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; 

Aussi, notez que je coalesce pour vous assurer la capture des null journaux.

Maintenant, si vous voulez voir la dernière date du journal:

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 

Si vous voulez faire cela pour seulement une entreprise spécifique, faire:

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 

De cette façon, vous aren » t renvoyant l'intégralité de la liste dans cette sous-requête.

+0

Je n'ai aucune idée de existe. mais il renvoie une erreur: # 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'existe ( SELECT 1 FROM h_company hc1 LOGICIELS LEFT JOIN ON (hc1.id_company =' à la ligne 8 –

+0

@Daniel: oublié le 'and':) – Eric

+0

ya j'ai déjà ajouté 'et' mais il renvoie zéro résultat .. hmm .. im en utilisant pour le faire par requête et maintenant ne peux pas le combiner lol –