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.IDSites.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 中评论的那样。