SELECT COUNT(DISTINCT `Table`.`ID`) returns 0 仅用于特定表
SELECT COUNT(DISTINCT `Table`.`ID`) returns 0 for only specific tables
在使用 rails_admin 应用程序管理我们的数据库时,我们注意到底部的两个 table 分页,'Signals' 和 'SignalsHistory' 是丢失,它只是说有 0 个,尽管能够看到视图中列出的记录。
进一步的调查使我检查了开发日志并查看 rails 正在执行什么查询来获取分页的行数。
SELECT COUNT(DISTINCT `SignalsHistory`.`ID`) FROM `SignalsHistory` LEFT OUTER JOIN `Signals` ON `Signals`.`ID` = `SignalsHistory`.`SignalsID`
这个returns
+---------------------------------------+
| COUNT(DISTINCT `SignalsHistory`.`ID`) |
+---------------------------------------+
| 0 |
+---------------------------------------+
我知道在我的 table 中实际上有 16196 个 ID 字段的唯一实例,因为它是主键。这里是table进行比较:
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)
同一个查询 returns 在不同的 table 上使用时的正确数量的结果,(如 Devices
.ID
、Sites
.ID
, 等等)但不是特别在这个 table 上。
为了确认我实际上可以在没有 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 会破坏我的计数查询,然后我发现了 然后我尝试模仿它以查看是否可以让它工作,如下所示:
mysql> SELECT COUNT(*) FROM (SELECT DISTINCT ID FROM SignalsHistory WHERE ID IS NOT NULL) test;
+----------+
| COUNT(*) |
+----------+
| 16196 |
+----------+
1 row in set (0.00 sec)
还是不行,求助大家。我为此焦头烂额,真的不知道发生了什么,因为它似乎仅限于此 table。
我知道 Signal
是最近在 MySQL 中的保留字,这就是我避免明确使用它的原因。 'SignalsHistory' 会搞砸吗?
我的 MySQL 版本是:
mysql --version
mysql Ver 14.14 Distrib 5.6.33, for debian-linux-gnu (x86_64) using EditLine wrapper
正如 Barmar, this is a known and long-standing bug 在 MySQL 中评论的那样。
在使用 rails_admin 应用程序管理我们的数据库时,我们注意到底部的两个 table 分页,'Signals' 和 'SignalsHistory' 是丢失,它只是说有 0 个,尽管能够看到视图中列出的记录。
进一步的调查使我检查了开发日志并查看 rails 正在执行什么查询来获取分页的行数。
SELECT COUNT(DISTINCT `SignalsHistory`.`ID`) FROM `SignalsHistory` LEFT OUTER JOIN `Signals` ON `Signals`.`ID` = `SignalsHistory`.`SignalsID`
这个returns
+---------------------------------------+
| COUNT(DISTINCT `SignalsHistory`.`ID`) |
+---------------------------------------+
| 0 |
+---------------------------------------+
我知道在我的 table 中实际上有 16196 个 ID 字段的唯一实例,因为它是主键。这里是table进行比较:
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)
同一个查询 returns 在不同的 table 上使用时的正确数量的结果,(如 Devices
.ID
、Sites
.ID
, 等等)但不是特别在这个 table 上。
为了确认我实际上可以在没有 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 会破坏我的计数查询,然后我发现了
mysql> SELECT COUNT(*) FROM (SELECT DISTINCT ID FROM SignalsHistory WHERE ID IS NOT NULL) test;
+----------+
| COUNT(*) |
+----------+
| 16196 |
+----------+
1 row in set (0.00 sec)
还是不行,求助大家。我为此焦头烂额,真的不知道发生了什么,因为它似乎仅限于此 table。
我知道 Signal
是最近在 MySQL 中的保留字,这就是我避免明确使用它的原因。 'SignalsHistory' 会搞砸吗?
我的 MySQL 版本是:
mysql --version
mysql Ver 14.14 Distrib 5.6.33, for debian-linux-gnu (x86_64) using EditLine wrapper
正如 Barmar, this is a known and long-standing bug 在 MySQL 中评论的那样。