我正在运行带有两个表的MySQL 5.7服务器:
表_A
id name
.........
1 foo
2 bar
表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)
但是,当我使用PyMySql(0.9.3)在Python(3.7)中运行相同的查询时,光标会生成以下警告:
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中的错误,因为警告引用了2行结果集中的第3行。
试图缩小根本原因,我认为这可能与时间戳列中NULL值聚合中的错误有关,因此我将查询更新为仅在COUNT(table_b)时计算MAX(b.created_at)。 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提出问题。
我发现了其他一些讨论相同警告的问题,但它们涵盖了人们尝试insert / update '0000-00-00 00:00:00' values或filtering for them的情况。