Запрос не возвращает ожидаемые результаты - PullRequest
0 голосов
/ 11 мая 2018

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

SELECT
  last_name,
  first_name,
  DATE_FORMAT((tm_date), '%Y-%m-%d') AS dates,
  SUM(tm_hours) total
FROM timecard
LEFT JOIN teachers i
  ON i.ds_id = timecard.ds_id
WHERE tm_notes != 'Lunch Break'
AND tm_date BETWEEN '2018-04-16' AND '2018-04-30'
AND timecard.ds_id = '4'
GROUP BY CONCAT(YEAR(tm_date), '/', WEEK(tm_date)),
         timecard.ds_id
ORDER BY last_name ASC, dates ASC

Этот запрос вернет первую запись, как если бы неделя началась 2018-04-20, но это должна быть 2018-04-16. Когда я запускаю этот запрос для других пользователей timecard.ds_id, запрос всегда возвращает 2018-04-16 в качестве первой записи, и я не понимаю, почему у этого конкретного пользователя отображается 2018-04-20.

это результаты

results

это пример данных

sample data

Спасибо

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

При выборе столбца, не включающего вашу группу по выражению и не переданного статистической функции, MySQL выбирает произвольную строку tm_date из сгруппированных строк. (Это настройка; вы можете изменить ее, и MySQL выдаст исключение)

Вы должны сказать MySQL, что вы хотите. Я думаю MIN работает здесь.

DATE_FORMAT(MIN(tm_date), '%Y-%m-%d') AS dates,
0 голосов
/ 11 мая 2018

Вот документация MySQL для того, что указывает Terminus.Это стоит прочитать.https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

Если ONLY_FULL_GROUP_BY отключен, расширение MySQL к стандартному использованию SQL GROUP BY позволяет списку выбора, условию HAVING или списку ORDER BY ссылаться на неагрегированные столбцы, даже если столбцы являютсяфункционально не зависит от столбцов GROUP BY.Это заставляет MySQL принять предыдущий запрос.В этом случае сервер может выбрать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются недетерминированными, что, вероятно, не то, что вам нужно.Кроме того, на выбор значений из каждой группы нельзя повлиять, добавив предложение ORDER BY.Сортировка набора результатов происходит после выбора значений, и ORDER BY не влияет на то, какое значение в каждой группе выберет сервер.Отключение ONLY_FULL_GROUP_BY полезно прежде всего, когда вы знаете, что из-за некоторого свойства данных все значения в каждом неагрегированном столбце, не названном в GROUP BY, одинаковы для каждой группы.

0 голосов
/ 11 мая 2018

Поскольку это группировка по неделям, вы не всегда можете получить результат, который ищете. Если вы хотите получить самый ранний результат, используйте MIN

DATE_FORMAT(MIN(tm_date), '%Y-%m-%d') AS dates,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...