2010-12-09 56 views
2

J'ai plusieurs tables (une pour chaque jour) qui ont toutes la même structure: ID, srcIP, heure.Comment obtenir un nombre d'éléments pour plusieurs tables

je peux obtenir le nombre total de lignes pour chaque jour en utilisant les éléments suivants:

SELECT 
    (SELECT COUNT(*) FROM Day1) as Day1Count, 
    (SELECT COUNT(*) FROM Day2) as Day2Count, 
    (SELECT COUNT(*) FROM Day3) as Day3Count 

Mais que me donne

Day1count Day1count Day1count 
102  148  131 

Mais comment puis-je obtenir un nombre total pour chaque adresse IP par jour ? Toutes les IP ne sont pas présentes tous les jours.

srcIP  D1 D2 D3 
172.16.0.1  99 34 
172.16.0.2 55  22 
172.16.0.3 47 49 75 

Merci d'avance!

+0

Est-ce que 'Day1' contient des journaux du jour 1 pour chaque mois? –

+0

oui, seulement trois champs: ID, srcIP, & heure. – Nathan

+0

non, chaque mois est une base de données et chaque table est un jour – Nathan

Répondre

1

Pour obtenir compte par IP et par jour, le plus simple est d'aplatir la requête:

SELECT 'day1' AS day, srcIP, count(*) AS count FROM Day1 GROUP BY srcIP 
UNION 
SELECT 'day2' AS day, srcIP, count(*) AS count FROM Day2 GROUP BY srcIP 
UNION 
SELECT 'day3' AS day, srcIP, count(*) AS count FROM Day3 GROUP BY srcIP 

puis transposer dans votre application pour obtenir le format de table que vous voulez.

Vous pouvez également

Vous pouvez aussi le faire en se joignant sur IP:

SELECT srcIP, d1.count, d2.count, d3.count 
FROM (SELECT srcIP, count(*) AS count FROM Day1 GROUP BY srcIP) d1 
LEFT JOIN (SELECT srcIP, count(*) AS count FROM Day2 GROUP BY srcIP) d2 USING (srcIP) 
LEFT JOIN (SELECT srcIP, count(*) AS count FROM Day3 GROUP BY srcIP) d3 USING (srcIP) 

Mais ici, vous allez manquer IP qui ne sont pas Day1, à moins que vous devez d'abord faire un SELECT DISTINCT srcip de UNION de tous les jours, ce qui est assez cher. Fondamentalement, cette structure de table ne se prête pas trop facilement à ce type d'agrégation.

+0

qui était le meilleur que je pouvais trouver, car il y a environ 200 000 entrées par jour. Avez-vous de meilleures idées pour une structure? – Nathan

+0

Merci pour l'aide. Je l'ai essayé, mais ça ne faisait pas une colonne pour chaque jour. J'ai seulement produit une liste de ips & count. – Nathan

+1

Normalement, vous n'avez qu'une seule table avec des colonnes pour le mois et le jour (ou un horodatage). Regardez [table paritioning] (http://dev.mysql.com/tech-resources/articles/mysql_5.1_partitions.html) si vous voulez optimiser pour l'accès aux données par mois. – Dmitri