Запрос о Group By и сортировка в запросе Mysqli - PullRequest
0 голосов
/ 25 декабря 2018

Прежде всего, я прошу прощения, если есть подобные сообщения на этом форуме, пожалуйста, помогите мне освоить, мне нужен эффективный способ для запроса сводных данных моей таблицы посетителей, у меня есть таблица, похожая на эту: Имя таблицы: table_visitor

+----+------------+---------+---------------------+
| id |    city    | country |     time_visit      |
+----+------------+---------+---------------------+
|  1 | london     | uk      | 2017-11-02 13:01:00 |
|  2 | new york   | usa     | 2017-11-13 00:23:00 |
|  3 | london     | uk      | 2017-11-17 10:23:00 |
|  4 | bristol    | uk      | 2017-11-22 07:00:00 |
|  5 | texas      | usa     | 2017-11-30 04:10:00 |
|  6 | dublin     | ireland | 2017-12-02 13:01:00 |
|  7 | new york   | usa     | 2017-12-13 00:23:00 |
|  8 | london     | uk      | 2017-12-17 10:23:00 |
|  9 | bristol    | uk      | 2017-12-22 07:00:00 |
| 10 | london     | uk      | 2018-01-01 10:00:00 |
| 11 | washington | usa     | 2018-01-13 14:00:00 |
+----+------------+---------+---------------------+

Мне нужен эффективный запрос с минимальным временем выполнения, который может привести к отдельным данным (группировать, считать и сортировать по алфавиту столбца города и страны путем сортировки из столбца time_visit), как пример таблицы, показанной ниже.Название таблицы: visitor_summary

+----+------+-------+--------------------------------------------+-------------------------+
| id | year | month |                    city                    |         country         |
+----+------+-------+--------------------------------------------+-------------------------+
|  1 | 2017 |    11 | london(2),bristol(1),new york(1),texas(1)  | uk(3),usa(2)            |
|  2 | 2017 |    12 | bristol(1),dublin(1),london(1),new york(1) | uk(2),ireland(1),usa(1) |
|  3 | 2018 |     2 | london(1),washington(1)                    | uk(1),usa(1)            |
+----+------+-------+--------------------------------------------+-------------------------+

Заранее спасибо, мастер.

1 Ответ

0 голосов
/ 25 декабря 2018

Это сложная проблема с отчетностью.Функция GROUP_CONCAT может делать то, что вы хотите, но для этого потребуется уже иметь таблицу с городами и их общим количеством, за месяц и год, или странами и их общим количеством.Таким образом, один из подходов состоит в том, чтобы выполнить объединение, сначала агрегируя по году, месяцу и городу / стране, а затем снова агрегируя только по году и месяцу, чтобы получить нужный отчет CSV.

SELECT
    t1.year,
    t1.month,
    t1.cities,
    t2.countries
FROM
(
    SELECT
        year,
        month,
        GROUP_CONCAT(t.city_label, '(', CAST(t.cnt AS CHAR(50)), ')') cities
    FROM
    (
        SELECT
            YEAR(time_visit) year,
            MONTH(time_visit) month,
            CONCAT(country, '-', city) AS city_label,
            COUNT(*) AS cnt
        FROM table_visitor
        GROUP BY YEAR(time_visit), MONTH(time_visit), CONCAT(country, '-', city)
    ) t
    GROUP BY year, month
) t1
INNER JOIN
(
    SELECT
        year,
        month,
        GROUP_CONCAT(t.country, '(', CAST(t.cnt AS CHAR(50)), ')') countries
    FROM
    (
        SELECT YEAR(time_visit) year, MONTH(time_visit) month, country, COUNT(*) AS cnt
        FROM table_visitor
        GROUP BY YEAR(time_visit), MONTH(time_visit), country
    ) t
    GROUP BY
        year, month
) t2
    ON t1.year = t2.year AND t1.month = t2.month
GROUP BY
    t1.year,
    t1.month;

enter image description here

Демо

Обратите внимание, что в моем выводе я имею в виду города, используя как город, так и название страны.Причиной этого является то, что данное название города не может быть уникальным в разных странах.Например, в американском штате Огайо есть город под названием Лондон, поэтому использование Лондона в отчете может быть неоднозначным.

Если вы хотите упорядочить данные CSV в столбцах города или страны, посмотритеиспользуя ORDER BY с GROUP_CONCAT.

Редактировать:

Из ваших комментариев ниже видно, что у вас может быть действительно большая таблица, и, кроме того, что выможет потребоваться запустить этот отчет часто в производстве.Я бы предложил вам разбить отчет на части.Например, вы можете запустить процесс, который использует вышеупомянутый запрос в конце каждого года / месяца.Затем он может вставить запись о результате в предложенную вами таблицу visitor_summary.Таким образом, на производство не повлияло бы то, что ему пришлось бы сразу разбить всю историческую таблицу.

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