Справка по SQL-запросам для данных диаграммы - PullRequest
1 голос
/ 17 августа 2011

Вот наша цель:

Мы хотим выбрать каждый месяц и доход, полученный за каждый месяц, для конкретного пользователя.

Вотнаши таблицы

продукт, покупка, пользователь, месяцы

пользователь 1 .. * продукт, продукт 1 .. * покупка

продукт имеет столбец 'user_id'и покупка имеет столбец 'product_id'

months - это просто таблица, которая содержит каждый месяц в виде строки.В настоящее время мы используем это, чтобы сделать несколько левых объединений, как вы можете видеть ниже.

SELECT months.name, IFNULL(sum(purchase.price), 0) as revenue
FROM months
    LEFT JOIN purchase
        ON DATE_FORMAT(purchase.purchase_date, '%M') = months.name
        AND DATE_FORMAT(purchase_date, '%Y') = DATE_FORMAT(CURRENT_DATE, '%Y')
        AND purchase.status = 2
GROUP BY name
ORDER BY months.id ASC;

, который отлично работает для ВСЕХ пользователей и ВСЕХ покупок, совершенных в этом месяце (статус покупки 2 означает завершение),Следующая часть - как мне отфильтровать это на основе идентификатора пользователя?В таблице «product» указан искомый идентификатор пользователя, а в таблице «product» указан «product_id».Каждый раз, когда я пытаюсь что-то сделать, он либо ничего не делает, либо удаляет все нулевые значения, которые нам не нужны.

ATTEMPT @ NathanialWools Предложение where удаляет все строки снулевой доход (или ноль, из-за оператора IFNULL).Вот что я попробовал:

SELECT name, IFNULL(sum(purchase.price), 0) as revenue
FROM months
    LEFT JOIN purchase
        ON DATE_FORMAT(purchase.purchase_date, '%M') = months.name
        AND DATE_FORMAT(purchase_date, '%Y') = DATE_FORMAT(CURRENT_DATE, '%Y')
        AND purchase.status = 2
    LEFT JOIN product
        ON product.id = purchase.product_id
WHERE product.user_id = 1
GROUP BY name
ORDER BY months.id ASC;

Ответы [ 4 ]

1 голос
/ 17 августа 2011

Если у вас есть список пользователей, с которого вы могли бы начать, присоединяйтесь к месяцам, а затем присоединяйтесь к продукту. (если вы не просто начинаете с продукта).

SELECT u.user_id, m.name, IFNULL(sum(p.price), 0) as revenue 
FROM user u
CROSS JOIN months m
LEFT JOIN product d
    ON u.user_id = d.user_id
LEFT JOIN purchase p
    ON DATE_FORMAT(p.purchase_date, '%M') = m.name
    AND DATE_FORMAT(p.purchase_date, '%Y') = DATE_FORMAT(CURRENT_DATE, '%Y')
    AND p.product_id = d.product_id
    AND p.status = 2
WHERE u.user_id = <user you care about>
GROUP BY u.user_id, m.name
ORDER BY m.id ASC;
0 голосов
/ 18 августа 2011

Внутренний выбор Кажется, чтобы сделать трюк. Левого объединения на покупку одного было недостаточно, фильтрация. Вот решение, которое работает для меня:

SELECT m.name, IFNULL(sum(b.price), 0) as revenue
FROM months as m
LEFT JOIN (SELECT price, purchase_date, status
           FROM purchase, product
           WHERE purchase.product_id = product.id
           AND product.user_id = 1) as b
    ON DATE_FORMAT(b.purchase_date, '%M') = m.name
    AND DATE_FORMAT(b.purchase_date, '%Y') = DATE_FORMAT(CURRENT_TIMESTAMP, '%Y')
    AND status = 2
GROUP BY m.name
ORDER BY m.id ASC

Где вы, очевидно, измените «1» в зависимости от того, на какого пользователя вы хотите посмотреть.

Спасибо всем за участие, сделали отладку быстрее.

0 голосов
/ 17 августа 2011

Что вы пробовали?

SELECT months.name, u.user_id, sum(IFNULL(purchase.price, 0)) as revenue
FROM months
    LEFT JOIN purchase pu
        ON DATE_FORMAT(purchase.purchase_date, '%M') = months.name
        AND DATE_FORMAT(purchase_date, '%Y') = DATE_FORMAT(CURRENT_DATE, '%Y')
        AND purchase.status = 2
    LEFT JOIN product pr
        ON pr.product_id = pr.product_id
    LEFT JOIN user u
        ON u.user_id = pr.user_id
GROUP BY pu.name, u.user_id
ORDER BY months.id ASC;
0 голосов
/ 17 августа 2011

LEFT JOIN на продукт и добавьте предложение WHERE, где user_id равен нулю или user_id равен вашему значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...