2011-08-23 8 views
2

D'accord, je suis coincé sur un problème.Assembler cinq tables

J'ai environ 5 tables de base de données. Une table contient une liste de campagnes, une autre une liste de groupes d'annonces, une autre une liste d'annonces, une autre une liste de clics, une autre une liste de prospects et une autre une liste de prospects. Chaque table comporte également d'autres colonnes. Par exemple, dans les clics, vous disposez d'un compte ad_id et d'un compte de colonne, et la table d'état des prospects comporte un identifiant principal, un acheteur et un montant. Chaque table contient une colonne avec un identifiant associé à un autre identifiant de table.

Je suis en train de récupérer mes données dans le format suivant

campaign keyword count(keyword) sum(amount) buyer 
bing-auto rap  15    45   david 
google-auto honda  10    30   chris 

Fondamentalement, il est tout de plomb succès regroupés par mots clés et campagne.

Cependant, je n'arrive pas à résoudre ce problème.

SELECT keyword, COUNT(keyword) FROM in_clicks AS ic 
     INNER JOIN ads AS a ON ic.ad_id = a.id 
     INNER JOIN ad_groups AS ag ON a.ad_group_id = ag.id 
     INNER JOIN campaigns AS c ON ag.campaign_id = c.id; 
     INNER JOIN lead_status AS ls ON l.id = ls.id 
     INNER JOIN leads AS l ON ic.in_click_id = l.id 
WHERE ic.create_date LIKE '%2011-08-19%' AND ic.location NOT LIKE '%Littleton%' 
GROUP BY ic.keyword ORDER BY COUNT(ic.keyword) DESC 

Je sais que ce n'est pas une bonne explication, et ma question ci-dessus n'est pas bon, mais je suis un peu coincé sur la façon de procéder. Quelqu'un peut-il m'aider à me diriger dans la bonne direction?

EDIT: Voici le schéma de la table.

CAMPAIGN 
id name trafficsource createdate 
20 hip hop bing   2001-08-16 
21 rap  bing   2001-08-18 

AD GROUPS 
id name campaignid createdate 
15 jayz  20   2001-08-16 
16 eminem 21   2001-08-18 

ADS 
id headline adgroupid 
13 cool is cool 15 
14 wow, great  16 

IN CLICKS 
id keyword adid createdate 
205 his name 13  2001-08-16 
206 whoa  14  2001-08-18 

LEADS 
id in_click_id create_date 
300 205   2001-08-16 
301 206   2001-08-18 

LEAD STATUS 
id lead_id success amount buyer 
501 300   0  5  jack 
502 300   1  15  jill 
+2

peuvent vous poster votre schéma de table? –

+3

Un début similaire à% est généralement une mauvaise idée, car cela empêche le serveur d'utiliser un index. Si ic.create_date est un type de données, utilisez par exemple. entre pour définir un début/fin. –

+0

Quelle est la question? La requête SQL semble valide au premier coup d'oeil, alors qu'est-ce qui ne va pas? Selon votre description, vous pouvez facilement ajouter les colonnes manquantes à votre SELECT. –

Répondre

2

Quelque chose comme ça?

SELECT 
    c.name as campaign 
    , ic.keyword 
    , count(ic.keyword) as keycount 
    , sum(ls.amount) as total_amount 
    , group_concat(ls.buyer) as buyers 
FROM in_click ic 
INNER JOIN ads AS a ON (ic.ad_id = a.id) 
INNER JOIN ad_groups AS ag ON (a.ad_group_id = ag.id) 
INNER JOIN campaigns AS c ON (ag.campaign_id = c.id) 
INNER JOIN lead_status AS ls ON (l.id = ls.id) 
INNER JOIN leads AS l ON (ic.in_click_id = l.id) 
WHERE ic.create_date BETWEEN 2011-08-01 and 2011-08-31 
     AND ic.location NOT LIKE 'test%' 
GROUP BY ic.keyword 
ORDER BY keycount 

Remarques
Ne pas utiliser LIKE pour datefields, utilisez BETWEEN startdate AND enddate.
Si vous utilisez LIKE %...., vous ne serez pas en mesure d'utiliser un index.
Essayez et utilisez LIKE cghxgs%, de cette façon vous serez en mesure d'utiliser un index.
Si vous devez effectuer des correspondances de texte d'index, utilisez les index de texte intégral avec la syntaxe MATCH AGAINST.
Cela ne fonctionnera que sur les tables MyISAM cependant ....

Liens:
http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_between
http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html#function_match
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat