MySQL INNER JOIN - '='vs'like'

Eri*_*son 17 mysql activerecord inner-join

我们在MySQL内连接方面遇到了一些奇怪的问题.基本上,我们在使用'='运算符时会出现奇怪的错误,但使用'like'会使其工作.不幸的是,这是通过ActiveRecord,并没有简单的方法只是在那里打'喜欢',而且我们想要了解这里实际发生了什么.

这是失败的查询:

mysql> SELECT COUNT(*) FROM `versions` INNER JOIN `site_versions`
              ON `versions`.id = `site_versions`.version_id;
Run Code Online (Sandbox Code Playgroud)

这是错误:

ERROR 1296 (HY000): Got error 20008 'Query aborted due to out of query memory'
from NDBCLUSTER
Run Code Online (Sandbox Code Playgroud)

这是有效的查询:

mysql> SELECT COUNT(*) FROM `versions` INNER JOIN `site_versions`
              ON `versions`.id like `site_versions`.version_id;
Run Code Online (Sandbox Code Playgroud)

以下是表格本身的一些细节:

mysql> desc site_versions;
+----------------------+----------+------+-----+---------+----------------+
| Field                | Type     | Null | Key | Default | Extra          |
+----------------------+----------+------+-----+---------+----------------+
| id                   | int(11)  | NO   | PRI | NULL    | auto_increment |
| version_id           | int(11)  | YES  | MUL | NULL    |                |
[..snip..]
+----------------------+----------+------+-----+---------+----------------+

mysql> desc versions;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
[..snip..]
+------------+--------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

任何想法为什么'喜欢'工作和'='不?

sea*_*rty 0

不确定这是否能解决您的问题,但有可能。不要使用count(*). 也许它对计算什么感到“困惑”。最佳实践是对特定字段进行计数,例如id。为此,您需要使用表的别名。

SELECT COUNT(v.id) FROM versions as v
INNER JOIN site_versions as sv ON v.id = sv.version_id;
Run Code Online (Sandbox Code Playgroud)

  • 在像OP这样的不寻常情况下,一定不要对像你这样的建议感到太惊讶。而我不会。但是,这句话“最好的做法是对特定字段进行计数”*,是在另一个字段的上下文中做出的,即“不要使用 `count(*)`”*,听起来像是对至少可以说,未来是有争议的。无论行中的数据或任何其他条件如何,使用“COUNT(*)”对组中的行进行计数都是完全有效的并且符合标准。也许它在 MySQL 中存在一些含义,但是您可能不得不提及事实确实如此。 (4认同)