2017-05-19 1 views
2

Je tableau mail:Mysql comment compter les données de plusieurs tables avec plusieurs conditions

+---------+-----------+--------------+ 
| m_id | dns_id | mail_name | 
+---------+-----------+--------------+ 
|  1|   5 | myac1  | 
|  2|   5 | myac2  | 
+---------+-----------+--------------+- 

dns_id est id du nom de domaine de la table dns
m_id il est champ clé avec id email
mail_name nom email

Tableau dns

+-----------+-----------+------------+ 
| dns_id | acc_id |   dns| 
+-----------+-----------+------------+ 
|   5 |   1 | test.com| 
|   6 |   1 | test2.com|    
+-----------+-----------+------------+ 

acc_id id de mes comptes
dns nom de mes domaines

Comment vous pouvez voir, j'ai deux domaines différents pour un seul compte. Champ dns_id du tableau dns lié à dns_id à partir du tableau mail. J'ai des comptes de messagerie pour dns_id avec l'ID 5 et avec le nom test.com. Mais je n'ai pas les comptes de messagerie pour test2.com avec dns_id 6. je dois calculer le nombre de dns_id pour acc_id simple:

select count(dns_id) from dns where acc_id = 1; 

Résultat:

+------------------+ 
| count(dns_id) | 
+------------------+ 
|    2 | 
+------------------+ 
1 row in set (0.00 sec) 

Mais, si je veux faire compte uniquement pour les domaines ayant un compte de messagerie dans la table mail. Comment faire ça? Je ne veux pas calculer les domaines, où je n'ai pas de compte de messagerie. Dans ce cas, je devrais avoir:

+------------------+ 
| count(dns_id) | 
+------------------+ 
|    1 | 
+------------------+ 
1 row in set (0.00 sec) 

Parce que mon dns_id numéro 6 avec le domaine test2.com ne dispose pas de compte de messagerie dans le tableau mail.

+0

Astuce: 'JOIN',' IN' ou 'EXISTS'. –

+0

J'ai essayé, mais j'ai une erreur: 'ERREUR 1052 (23000): Colonne 'domain_id' dans la liste des champs est ambiguë – Piduna

+0

Qualifiez vos colonnes, par exemple. 'dns.domain_id'. – jarlh

Répondre

1

Essayez

SELECT COUNT(dns_id) 
FROM dns 
WHERE acc_id IN (
    SELECT m_id FROM mail 
) 
+2

Le 'SELECT DISTINCT' est totalement inutile en toutes circonstances, et mauvais conseil. –

+0

@GordonLinoff Thx pour obtenir des conseils. Je suis nouveau à sql. Quelle est l'alternative –

+1

Il suffit d'utiliser 'SELECT'. L'opérateur 'IN' ne peut pas créer de lignes dupliquées, il n'y a donc pas besoin de' SELECT DISTINCT'. –

0

Je suis sûr que je l'ai compris correctement, mais pouvez-vous essayer ci-dessous requête. SELECT COUNT (*) DE dbo.DNS OU (ACC_ID = 1) ET dns_id IN (SELECT D_ID DE dbo.Mail)

+0

Je reçois les résultats en 1 – Neha