Непонятная особенность использования `DATE (поле с DATETIME)` во вложенном запросе с HAVING

Основная информация:

Проблема: решил повозиться с использованием даты во вложенном запросе в учебных для меня целях. И получаю странный результат - отдельно вложенный запрос с DATE (поле с DATETIME) работает, как нужно. Но в качестве вложенного запроса выдает ошибку. Выглядит она непонятно для меня. При этом, если в этом вложенном запросе использовать просто поле с DATETIME, то ошибки нет. Почитал документацию по DATE - все равно непонятно. Просьба подсказать, в чем дело, как с этим справляться и есть ли аналогичные проблемы на более широком уровне? Запускаю на платформе Stepic, может у них проблема?

Что код делает: если User c конкретной card в один день звонит из разных городов, то все эти звонки запрос и выдает (по всем таким User).

Код с ошибкой:

SELECT id, User, card, DATE(calling_Time) AS Calling_DATE, City 
FROM calls
WHERE (User, card, DATE(calling_Time)) IN ((
    SELECT User, card, DATE(calling_Time)  
    FROM calls
    GROUP BY User, card, DATE(calling_Time)
    HAVING COUNT(City) > 1));

Текст ошибки: ERROR 1055: Expression #1 of HAVING clause is not in GROUP BY clause and contains nonaggregated column 'calls.calling_Time' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Дополнительная информация

Работающий внутренний запрос + результат:

SELECT User, card, DATE(calling_Time)  
    FROM calls
    GROUP BY User, card, DATE(calling_Time)
    HAVING COUNT(City) > 1;

+------+------+--------------------+
| User | card | DATE(calling_Time) |
+------+------+--------------------+
| 1    | 1    | 2018-05-25         |
+------+------+--------------------+
Affected rows: 1

Работающий полный код (только без DATE) + результат:

SELECT id, User, card, calling_Time, City 
FROM calls
WHERE (User, card, calling_Time) IN ((SELECT User, card, calling_Time  
    FROM calls
    GROUP BY User, card, calling_Time
    HAVING COUNT(City) > 1));

+----+------+------+---------------------+--------+
| id | User | card | calling_Time        | City   |
+----+------+------+---------------------+--------+
| 1  | 1    | 1    | 2018-05-25 21:25:54 | Москва |
| 4  | 1    | 1    | 2018-05-25 21:25:54 | Питер  |
+----+------+------+---------------------+--------+
Affected rows: 2

Создание и заполнение тестовой таблицы:

CREATE TABLE calls(
    id INT PRIMARY KEY AUTO_INCREMENT,
    user VARCHAR (25),
    card INT,
    calling_Time DATETIME,
    City VARCHAR (25)
);
INSERT INTO calls (user, card, calling_Time, City)
    VALUES
    (1, 1, '2018-05-25 21:25:54', 'Москва'),
    (2, 1, '2018-05-25 21:25:54', 'Самара'),
    (1, 1, '2018-05-26 21:25:54', 'Москва'),
    (1, 1, '2018-05-25 21:25:54', 'Питер')
;
SELECT * FROM calls;

+----+------+------+---------------------+--------+
| id | user | card | calling_Time        | City   |
+----+------+------+---------------------+--------+
| 1  | 1    | 1    | 2018-05-25 21:25:54 | Москва |
| 2  | 2    | 1    | 2018-05-25 21:25:54 | Самара |
| 3  | 1    | 1    | 2018-05-26 21:25:54 | Москва |
| 4  | 1    | 1    | 2018-05-25 21:25:54 | Питер  |
+----+------+------+---------------------+--------+
Affected rows: 4

Ответы (1 шт):

Автор решения: Сергей

Судя по ответу @AndrewNikolaev, у которого мой код с потенциальной ошибкой работает, проблема с моим кодом - особенность платформы, на которой я его запускал. У автора вопроса, которому я помогал, код на Oracle тоже заработал с минимальными изменениями, вызванными разным синтаксисом версий. Отключение only_full_group_by по совету @AndrewNikolaev должно было помочь, но на платформе Stepic я это сделать не могу.

Выводы:

  1. идея была верной разместить после полноценного поиска ошибки структурированный вопрос с минимально воспроизводимым примером тут.
  2. После набора опыта имеет смысл меньше времени тратить на проверки в случае подозрений на систему, если поведение явно нелогично.
  3. И имеет смысл работать на своей системе, а не на внешней.
→ Ссылка