2009-03-06 8 views
3

J'ai un tables appelées pages, PAGE_VIEWS, page_items et page_votes. Les trois dernières tables contiennent une clé étrangère page_id afin de conserver un enregistrement de chaque vue individuelle, élément et vote appartenant à une page.Utilisation de plusieurs COUNT et SUM en une seule instruction SQL

Quand j'Interroger une page, je veux aussi récupérer COUNT PAGE_VIEWS, COUNT page_items et SUM page_votes.vote.

J'ai collé une requête ci-dessous. Il récupère le nombre total de vues. J'ai fait plusieurs tentatives pour ajouter des éléments et des votes, mais le résultat est soit une erreur de syntaxe, soit des vues/items/votes retournés comme un nombre identique et "faux", probablement en raison de la façon dont je me joindrai.

Comment puis-je ajouter des objets et des votes à cette requête?

SELECT 
    Page.*, 
    COUNT(*) AS views 
FROM pages AS Page 
INNER JOIN page_views AS PageView 
    ON Page.id = PageView.page_id 
GROUP BY Page.id 
ORDER BY views DESC 
LIMIT 10 OFFSET 0 

Répondre

4

Cela sélectionnera TOP 10 viewed pages, et comptera des éléments et des votes pour que ces pages.

Efficace si vous avez beaucoup de pages mais n'avez besoin que de 10 d'entre eux, élimine les comptages inutiles.

SELECT (
     SELECT COUNT(*) 
     FROM page_views 
     WHERE page_views.page_id = pages.id 
     ) AS views_count, 
     (
     SELECT COUNT(*) 
     FROM page_items 
     WHERE page_items.page_id = pages.id 
     ) AS items_count, 
     COALESCE(
     (
     SELECT SUM(vote) 
     FROM page_votes 
     WHERE page_votes.page_id = pages.id 
     ), 0) AS votes_sum 
FROM pages 
ORDER BY 
     views_count DESC 
LIMIT 10 

requête Encore plus efficace:

SELECT pages.*, 
     (
     SELECT COUNT(*) 
     FROM page_items 
     WHERE page_items.page_id = pages.id 
     ) AS items_count, 
     COALESCE(
     (
     SELECT SUM(vote) 
     FROM page_votes 
     WHERE page_votes.page_id = pages.id 
     ), 0) AS votes_sum 
FROM (
     SELECT page_id, COUNT(*) AS cnt 
     FROM page_views 
     GROUP BY 
       page_id 
     ORDER BY cnt DESC 
     LIMIT 10 
     ) AS pvd, 
     pages 
WHERE pages.id = pvd.page_id 

, élimine non nécessaire se joint à pages.

+0

Merci! La requête que vous avez donnée avant l'édition a fonctionné. La version optimisée me donne une erreur # 1054 - Colonne inconnue 'pages.id' dans 'clause where'. –

+0

Oh, désolé. Voir le message mis à jour. – Quassnoi

1

En supposant que je l'ai lu correctement votre SQL et que vous voulez le top 10 des pages vues par, essayez ceci:

SELECT p.*, 
    (SELECT SUM(views) FROM page_views WHERE page_id = p.page_id) views, 
    (SELECT SUM(votes) FROM page_votes WHERE page_id = p.page_id) votes, 
    (SELECT SUM(items) FROM page_items WHERE page_id = p.page_id) items 
FROM pages p 
ORDER BY views DESC 
LIMIT 10 
Questions connexes