MySQL выдает ошибку 1111, когда я пытаюсь выполнить свой запрос, как мне исправить предложения group by и having?

#mysql #sql

#mysql #sql

Вопрос:

Я запускаю запрос, чтобы найти, какая служба была запланирована реже всего, и продолжаю сталкиваться с ошибкой 1111: недопустимое использование функции group . Я несколько раз пытался переформатировать свой запрос и не могу решить проблему. Есть ли другой синтаксис, который я должен использовать?

Таблица service содержит service_id, service_description и service_cost, а таблица scheduled_service содержит scheduled_service_id, appointment_id и service_id. Я несколько раз пытался изменить формулировку своего запроса, и все они выдают мне одну и ту же ошибку.

Это моя последняя попытка.

 SELECT s.service_id, COUNT(ss.scheduled_service_id) AS ' # Scheduled' 
FROM service s JOIN scheduled_service ss
ON s.service_id = ss.service_id
GROUP BY service_id
HAVING COUNT(ss.scheduled_service_id) =
(SELECT MIN(COUNT(scheduled_service_id)) FROM scheduled_service GROUP BY service_id);
  

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

 SELECT service_id, COUNT(scheduled_service_id) AS '# Scheduled' 
FROM scheduled_service 
GROUP BY service_id ;
  

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

Ответ №1:

Вы можете ORDER BY подсчитать, а затем LIMIT количество возвращенных строк до 1.

 SELECT s.service_id, COUNT(ss.scheduled_service_id) AS ' # Scheduled' 
FROM service s JOIN scheduled_service ss
ON s.service_id = ss.service_id
GROUP BY service_id
ORDER BY COUNT(ss.scheduled_service_id)
LIMIT 1
  

Ответ №2:

Если вы хотите использовать наименее часто, вы можете использовать:

 SELECT s.service_id, 
       COUNT(ss.scheduled_service_id) as num_scheduled
FROM service s JOIN
     scheduled_service ss
     ON s.service_id = ss.service_id
GROUP BY s.service_id
ORDER BY num_scheduled ASC
LIMIT 1;
  

Этот запрос на самом деле не требует JOIN , поэтому вы можете сделать:

 SELECT ss.service_id, 
       COUNT(ss.scheduled_service_id) as num_scheduled
FROM scheduled_service ss
GROUP BY ss.service_id
ORDER BY num_scheduled ASC
LIMIT 1;
  

Если вы не хотите подсчитывать службы, которые были запланированы с нулевым временем. В этом случае вы хотите LEFT JOIN :

Если вы хотите использовать наименее часто, вы можете использовать:

 SELECT s.service_id, 
       COUNT(ss.scheduled_service_id) as num_scheduled
FROM service s LEFT JOIN
     scheduled_service ss
     ON s.service_id = ss.service_id
GROUP BY s.service_id
ORDER BY num_scheduled ASC
LIMIT 1;