Как запросить таблицу MYSQL, чтобы получить количество появлений столбцов в целом и за последний год? - PullRequest
0 голосов
/ 27 июня 2019

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

Моя таблица встреч содержит следующие строки с образцами данных:

id | contact_id | appointment_date | status_id

1  |  1         |  2019-01-01      | Attended
2  |  1         |  2018-05-01      | Attended
3  |  2         |  2019-04-01      | Cancelled
4  |  2         |  2019-05-01      | No Show
5  |  1         |  2018-07-01      | Cancelled
6  |  1         |  2019-08-01      | Not Complete

Итак, скажем, я хочу увидеть, сколько раз у contact_id '1' были встречи, вот как я хочурезультат для просмотра:

 Status       |  Total overall | Total this year | Total last year
 Attended     |  2             | 1               | 1
 Cancelled    |  1             | 0               | 1
 No Show      |  0             | 0               | 0
 Not Complete |  1             | 1               | 0

Этот запрос выполним с MYSQL?

Я буду использовать его в веб-приложении HTML / PHP / jQuery.У меня будет кнопка, которая будет генерировать эту информацию после нажатия.Возможно, мне следует отказаться от идеи запроса и каким-то образом манипулировать ею с помощью какой-либо манипуляции с таблицей / данными jQuery после простого

'SELECT * from appointments WHERE contact_id = 1'?

1 Ответ

0 голосов
/ 27 июня 2019

Если вы хотите, чтобы это было в одном запросе, вы можете попробовать что-то вроде этого:

SELECT
      status_id
    , COUNT(*) AS `Total overall`
    , SUM(IF(YEAR(appointment_date) = YEAR(CURDATE()), 1, 0)) AS `Total this year`
    , SUM(IF(YEAR(appointment_date) = YEAR(CURDATE()) - 1, 1, 0)) AS `Total last year`
FROM
    appointment
WHERE
    contact_id = 1
GROUP BY
    status_id

=>

status_id   total   total_this_year total_last_year
Attended    2   1   1
Cancelled   1   0   1
Not Complete    1   1   0

Приведенный выше запрос не вернет информацию для «Не показывать». Если вам действительно нужны все статусы, вы можете сделать что-то вроде этого:

SELECT
      s.status_id
    , IFNULL(a.total, 0) AS `Total overall`
    , IFNULL(a.total_this_year, 0) AS `Total this year`
    , IFNULL(a.total_last_year, 0) AS `Total last year`
FROM
    (
        SELECT
            DISTINCT status_id
        FROM
            appointment
    ) AS s
    LEFT JOIN (
        SELECT
              status_id
            , COUNT(*) AS `total`
            , SUM(IF(YEAR(appointment_date) = YEAR(CURDATE()), 1, 0)) AS `total_this_year`
            , SUM(IF(YEAR(appointment_date) = YEAR(CURDATE()) - 1, 1, 0)) AS `total_last_year`
        FROM
            appointment
        WHERE
            contact_id = 1
        GROUP BY
            status_id
    ) AS `a` ON (
        a.status_id = s.status_id
    )

=>

status_id   Total overall   Total this year Total last year
Attended    2   1   1
Cancelled   1   0   1
Not Complete    1   1   0
No Show 0   0   0

P.S. Мне не нравятся вычисления по годам, которые я использовал в запросе, однако, для простоты я оставляю их здесь. В реальной жизни я бы использовал сравнение диапазона appointment_date BETWEEN CONCAT(YEAR(CURDATE()), '-01-01') AND CONCAT(YEAR(CURDATE()), '-12-31') вместо YEAR(appointment_date) = YEAR(CURDATE()).

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