Использование нескольких COUNT и SUM в одном операторе SQL - PullRequest
3 голосов
/ 07 марта 2009

У меня есть таблицы с именами pages , page_views , page_items и page_votes . Последние три таблицы содержат внешний ключ page_id , чтобы вести учет каждого отдельного представления, элемента и голоса, принадлежащего странице.

Когда я запрашиваю страницу, я также хочу получить COUNT page_views , COUNT page_items и SUM page_votes.vote .

Я вставил запрос ниже. Получает общее количество просмотров. Я предпринял различные попытки добавить элементы и голоса к нему, но в результате возникла либо синтаксическая ошибка, либо просмотры / элементы / голоса, возвращенные в качестве идентичного и «неправильного» числа, возможно, из-за способа, которым я присоединяюсь.

Как добавить элементы и голоса к этому запросу?

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

Ответы [ 2 ]

4 голосов
/ 07 марта 2009

При этом будут выбраны TOP 10 viewed страницы, и будут учитываться элементы и голоса только за эти страницы.

Эффективно, если у вас много страниц, но вам нужно только 10, устраняет ненужный подсчет.

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

Еще более эффективный запрос:

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

, удаляет ненужные объединения с помощью pages.

1 голос
/ 07 марта 2009

Предполагая, что я правильно прочитал ваш SQL, и вы хотите, чтобы 10 лучших страниц были просмотрены, попробуйте это

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...