Подсчитайте после объединения двух таблиц - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть следующие таблицы:

назначение

id |    date    |   time
1  | 2018-12-02 | 10:00:00
2  | 2018-12-05 | 12:00:00
3  | 2018-12-12 | 16:00:00
4  | 2018-12-12 | 17:00:00
5  | 2018-12-13 | 09:00:00

назначение_услуги

id | appointment_id | service_id
1  |        1       |     24
2  |        2       |     24
3  |        3       |     21
4  |        4       |     24
5  |        5       |     18

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

Таким образом, конечный результат будет

service_id | times
     24    |   3
     21    |   1
     18    |   1

Это то, что я сделал до сих пор

SELECT * FROM `appointment` a
INNER JOIN appointment_services s ON a.id = s.appointment_id
WHERE a.date BETWEEN '2018-12-10' AND '2018-12-18'

Ответы [ 5 ]

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

http://sqlfiddle.com/#!9/1ad0f03/1

SELECT s.service_id, COUNT(*) 
FROM `appointment_services` s
LEFT JOIN  appointment a 
ON a.id = s.appointment_id
WHERE a.date BETWEEN '2018-12-10' AND '2018-12-18'
GROUP BY s.service_id

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

service_id COUNT(*)
18          1
21          1
24          1
0 голосов
/ 18 декабря 2018

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

SELECT
    s.service_id,
    COUNT(a.id) AS times
FROM appointment_services s
LEFT JOIN
(
    SELECT id
    FROM appointment
    WHERE date BETWEEN '2018-12-10' AND '2018-12-18'
) a
    ON s.appointment_id = a.id
GROUP BY
    s.service_id;

enter image description here

Демо

Обратите внимание, что я преднамеренно изменил данные для service_id = 18 так, чтобы его единственное назначение не попадало в требуемый диапазон дат.Используя подход, который я предлагаю, мы по-прежнему сообщаем 18 с нулевым счетом.Выполнение прямого внутреннего соединения полностью отфильтровывало бы 18 и отображалось бы в наборе результатов.

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

Вы должны сгруппировать данные по столбцу service_id с помощью оператора GROUP BY .Например:

SELECT s.service_id, 
       count(*) as times
FROM `appointment` a
INNER JOIN appointment_services s ON a.id = s.appointment_id
WHERE a.date BETWEEN '2018-12-10' AND '2018-12-18'
GROUP BY s.service_id
0 голосов
/ 18 декабря 2018

Вы были близки:

select s.service_id, count(*) as times
from appointment_services s
join appintment a on a.id = s.appointment_id
where a.date between '2018-12-10' and '2018-12-18'
group by s.service_id
0 голосов
/ 18 декабря 2018

Вы можете попробовать ниже - с помощью агрегации count () и группировки по

 SELECT s.service_id, count(*) as cnttimes
    FROM `appointment` a
    INNER JOIN appointment_services s ON a.id = s.appointment_id
    WHERE a.date BETWEEN '2018-12-10' AND '2018-12-18'
    group by s.service_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...