Я использую сервер MySQL 5.7 с двумя таблицами:
Table_A
id name
.........
1 foo
2 bar
Table_B
id parent_id name created_at (default: CURRENT_TIMESTAMP)
................................................................
1 1 x 2019-01-01 10:00:00
2 1 y 2019-12-31 22:00:00
У меня есть этот запрос, чтобы получить счетчик записей Table_B, сгруппированный по имени Table_A с отметкой времени самой последней записи Table_B:
SELECT
a.name,
COUNT(b.id) AS entry_count_in_b,
MAX(b.created_at) AS last_entry_in_b
FROM
Table_A a
LEFT JOIN
Table_B b ON b.parent_id = a.id
GROUP BY 1
Клиент командной строки MySQL возвращает ожидаемый результат:
+------+------------------+---------------------+
| name | entry_count_in_b | last_entry_in_b |
+------+------------------+---------------------+
| bar | 0 | NULL |
| foo | 2 | 2019-12-31 22:00:00 |
+------+------------------+---------------------+
2 rows in set (0.0267 sec)
Когда я выполняю тот же запрос в Python (3.7), используя PyMySql (0.9.3), курсор создает следующее предупреждение:
lib/python3.7/site-packages/pymysql/cursors.py:329: Warning: (1292, "Incorrect datetime value: '0000-00-00 00:00:00' for column 'last_entry_in_b' at row 3")
Это может быть ошибка в PyMySql, так как предупреждениессылается на строку 3 в наборе результатов 2 строки.
Пытаясь сузить основную причину, я подумал, что это может быть связано с ошибкой агрегации значений NULL в столбце метки времени, поэтому я обновил запрос, чтобы вычислять только MAX (b.created_at), когда COUNT(table_b.id)> 1:
SELECT
a.name,
COUNT(b.id) AS entry_count_in_b,
CASE
WHEN COUNT(b.id) = 0 THEN NULL
ELSE MAX(b.created_at)
END AS last_entry_in_b
FROM
Table_A a
LEFT JOIN
Table_B b ON b.parent_id = a.id
GROUP BY 1
Это генерирует то же предупреждение, но теперь ссылается на столбец с именем 'tmp_field_0'.
lib/python3.7/site-packages/pymysql/cursors.py:329: Warning: (1292, "Incorrect datetime value: '0000-00-00 00:00:00' for column 'tmp_field_0' at row 3")
Интересно, кто-нибудь видел / решилэтот вопрос раньше?Если нет, я подам вопрос для PyMySql.
Я нашел другие вопросы, обсуждающие то же самое предупреждение, но они касаются случаев, когда люди пытаются вставить / обновить '0000-00-00 00:00:00'значения или фильтруются по ним .