在使用rails_admin应用程序管理我们的数据库时,我们注意到我们的两个表格的底部分页,' Signals'和' 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