Разбивка и группировка данных из MYSQL

Я не лучший специалист с запросами MYSQL, но этот заставил меня задуматься о том, как лучше всего это сделать, мой базовый образец данных MYSQL:

INSERT INTO `spending` (`spend_id`, `spend_user_id`, `spend_sender_id`, `spend_offer_id`, `spend_amount`, `spend_click`, `spend_date`) VALUES
(2, 190, 190, 34591, '0.15', 1, '2018-05-14 22:39:47'),
(3, 190, 190, 34591, '0.15', 1, '2018-05-14 22:39:52'),
(4, 190, 7, 34591, '0.15', 1, '2018-05-14 22:40:07'),
(5, 190, 10, 34591, '0.15', 1, '2018-05-14 22:42:15'),
(6, 190, 7, 34591, '0.15', 1, '2018-05-15 06:55:56'),
(7, 190, 7, 34591, '0.15', 1, '2018-05-16 17:05:29'),
(8, 190, 7, 34591, '0.15', 1, '2018-05-16 17:05:32');

Моя цель - разбить данные на 2 основных раздела Клики и Расходы, по сути, каждая запись рассматривается как 1 щелчок, панель инструментов html похожа на: Разбивка и группировка данных из MYSQL

затем 4 подраздела.

4 подраздела - это клики и стоимость сегодня, вчера, на прошлой неделе, в прошлом месяце для spend_user_id, я не знаю, как это лучше сделать, любые рекомендации будут оценены!

Вы пытались сделать это сами?

RiggsFolly 16.05.2018 19:22

Очень боюсь, я могу показать много неправильного кода и запросов, которые не работают! Я потратил на это безумное количество времени.

colinreedy674 16.05.2018 19:26

Покажите тот, который, по вашему мнению, наиболее близок, по крайней мере, это даст нам представление о том, что вы пытаетесь сделать

RiggsFolly 16.05.2018 19:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Например, чтобы получить результаты за текущий месяц, используйте этот подзапрос.

        SELECT COUNT(*) clicks, SUM(spend_amount) spend_amount
          FROM spending
         WHERE spend_date >= LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH

Когда у вас есть все эти подзапросы, вы можете объединить их вместе, чтобы получить свои результаты. (Обратите внимание: каждый подзапрос дает только одну строку, поэтому присоединение к ним без Условия ON также дают одну строку.)

Что-то вроде этого. (http://sqlfiddle.com/#!9/f8e090/7/0)

SELECT today.clicks, today.spend_amount, 
       yesterday.clicks, yesterday.spend_amount,
       week.clicks, week.spend_amount,
       month.clicks, month.spend_amount
  FROM
           (SELECT COUNT(*) clicks, SUM(spend_amount) spend_amount
              FROM spending
             WHERE spend_date >= CURDATE()) today
   JOIN           
           (SELECT COUNT(*) clicks, SUM(spend_amount) spend_amount
              FROM spending
             WHERE spend_date >= CURDATE() - INTERVAL 1 DAY
               AND spend_date < CURDATE()) yesterday
   JOIN
           (SELECT COUNT(*) clicks, SUM(spend_amount) spend_amount
              FROM spending
             WHERE spend_date >= CURDATE() - INTERVAL 7 DAY
               AND spend_date < CURDATE()) week
   JOIN        
           (SELECT COUNT(*) clicks, SUM(spend_amount) spend_amount
              FROM spending
             WHERE spend_date >= LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH) month

Я догадываюсь, что вы имеете в виду, говоря сегодня, вчера, неделю и месяц. Вы должны понять это, прежде чем ваш отчет будет иметь смысл для бизнеса.

Просто хочу добавить, прежде чем OP скажет, что это не желаемый результат, так как этот ответ - именно то, что я бы сделал. Если вам нужно сравнить дату на текущей неделе с воскресеньем или понедельником, вы можете использовать DATE_ADD(current_date, INTERVAL(1-DAYOFWEEK(current_date)) DAY), чтобы получить последнее воскресенье, замените 1-DAYOFWEEK на 2-DAYOFWEEK, чтобы получить понедельник. Вы также можете использовать DATE_FORMAT(NOW() ,'%Y-%m-01'), чтобы получить первые числа текущего месяца.

Lou 16.05.2018 20:13

это действительно желаемый результат, большое спасибо, я был далеко в своем тестировании.

colinreedy674 16.05.2018 22:51

Другие вопросы по теме