Сгруппированный запрос для поиска только одной записи (employee_id = 1 или null)

Моя информация о БД:
Сгруппированный запрос для поиска только одной записи (employee_id = 1 или null)

Я не буду получать для каждого дня недели уникальную запись, если employee_id имеет значение этой записи, иначе employee_id имеет значение Null. Я пробую этот запрос

SELECT 
  * 
FROM
  `calendar` 
WHERE `employee_id` = 1 
  OR `employee_id` IS NULL 
GROUP BY `weekday` 

результат

Сгруппированный запрос для поиска только одной записи (employee_id = 1 или null)

Но я ожидаю

Сгруппированный запрос для поиска только одной записи (employee_id = 1 или null)

Вы можете помочь мне? Спасибо

SELECT * FROM ... GROUP BY ... Что может быть не так? GROUP BY вносит наибольшую путаницу и "note, unfortunately, MySQL users that do not use the STRICT mode will still get a result here with arbitrary last names!, so a new MySQL user won’t understand their mistake"
Lukasz Szozda 27.05.2018 21:07
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
2
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема в том, что у вас есть столбцы в списке после SELECT, которые не появляются в выражении GROUP BY, и к ним не применена агрегатная функция. MySQL, в отличие от большинства других СУБД, позволяет это в более старых версиях (или с определенными настройками), но результаты, скорее всего, будут мусорными.

Исправьте это, включив столбцы в выражение GROUP BY или применив к ним агрегатную функцию. Например:

SELECT max(`employee_id`),
       `weekday`
       FROM `calendar` 
       WHERE `employee_id` = 1 
              OR `employee_id` IS NULL 
       GROUP BY `weekday`;

Обратите внимание на агрегатную функцию max() на employee_id.

ВЫБЕРИТЕ МАКС (employee_id), weekday, calendar_id ИЗ calendar, ГДЕ employee_id = 1 ИЛИ employee_id ЯВЛЯЕТСЯ НУЛЕВОЙ ГРУППой ПО weekday;

Davit 27.05.2018 21:22

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

Davit 27.05.2018 21:22

@david, ваш запрос не работает, потому что вы применили группу до в будний день. поэтому вам нужно взять все столбцы в операторе выбора, которые можно сгруппировать. Поскольку идентификатор календаря не сгруппирован (не должен быть), поэтому он не работает

G.Arima 27.05.2018 21:33
Ответ принят как подходящий

Попробуйте это:

SELECT 
  b.calendar_id,
  a.employee_id,
  a.weekday 
FROM
  (SELECT 
    `weekday`,
    MAX(employee_id) AS employee_id 
  FROM
    calendar 
  WHERE employee_id = 1 
    OR employee_id IS NULL 
  GROUP BY `weekday`) a 
  LEFT JOIN calendar b 
    ON a.weekday = b.weekday 
    AND a.employee_id = b.employee_id ;

Дайте мне знать в случае каких-либо уточнений.

Спасибо. Только спросите имя таблицы, это календарь, а не calender

Davit 27.05.2018 21:38

о да. я изменил это. У вас есть логика, моя работа сделана :)

G.Arima 27.05.2018 21:38

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

G.Arima 27.05.2018 21:45

Позвольте нам продолжить обсуждение в чате.

Davit 27.05.2018 21:59

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