在使用rails_admin应用程序管理我们的数据库时,我们注意到我们的两个表格底部的分页“信号”和“SignalsHistory”丢失了,它只是说有0个,尽管能够看到列出的记录在视图中。
进一步的调查导致我检查开发日志并查看正在执行的查询rails以获取分页的行数。
SELECT COUNT(DISTINCT `SignalsHistory`.`ID`) FROM `SignalsHistory` LEFT OUTER JOIN `Signals` ON `Signals`.`ID` = `SignalsHistory`.`SignalsID`
这回来了
+---------------------------------------+
| COUNT(DISTINCT `SignalsHistory`.`ID`) |
+---------------------------------------+
| 0 |
+---------------------------------------+
我知道我的表中实际上有16196个ID字段的唯一实例,因为它是主键。这是比较表:
mysql> describe SignalsHistory;
+----------------+-------------+------+-----+----------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+----------------------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| SignalsID | int(11) | NO | MUL | NULL | |
| CreateDateTime | datetime(6) | YES | | CURRENT_TIMESTAMP(6) | |
| Register | int(11) | YES | | NULL | |
| RecordNo | int(11) | YES | | NULL | |
| Invalid | tinyint(1) | YES | | NULL | |
+----------------+-------------+------+-----+----------------------+----------------+
6 rows in set (0.00 sec)
当在不同的表上使用时,同样的查询返回正确的结果数(例如Devices
.ID
,Sites
.ID
等),但特别是在此表中没有。
为了确认我实际上可以在没有Distinct子句的情况下计算它们,我在没有它的情况下再次运行它:
mysql> SELECT COUNT(`SignalsHistory`.`ID`) FROM `SignalsHistory` LEFT OUTER JOIN `Signals` ON `Signals`.`ID` = `SignalsHistory`.`SignalsID`;
+------------------------------+
| COUNT(`SignalsHistory`.`ID`) |
+------------------------------+
| 16196 |
+------------------------------+
1 row in set (0.01 sec)
我在网上看到为什么DISTINCT会破坏我的计数查询,然后我找到了this post然后我试图模仿我是否可以让它工作,如下:
mysql> SELECT COUNT(*) FROM (SELECT DISTINCT ID FROM SignalsHistory WHERE ID IS NOT NULL) test;
+----------+
| COUNT(*) |
+----------+
| 16196 |
+----------+
1 row in set (0.00 sec)
仍然没有工作,我转向你们所有人。我把头发拉过来,并不知道发生了什么,因为它似乎仅限于这张桌子。
我知道Signal
最近在MySQL中是一个保留字,这就是为什么我要避免明确地使用它。 'SignalsHistory'可能会搞乱吗?
我的MySQL版本是:
mysql --version
mysql Ver 14.14 Distrib 5.6.33, for debian-linux-gnu (x86_64) using EditLine wrapper
正如Barmar评论的那样,这是MySQL中的known and long-standing bug。