mysql - 带有 INNER JOIN 的 SELECT 子句影响行数的奇怪行为? (MySQL 5.1.52)

标签 mysql

我的一个测试用例遇到了一个我无法解释的奇怪问题。它归结为一个应该返回 1 行的查询,而不是返回零。

这是失败的查询。

SELECT roles.id FROM `roles` 
  INNER JOIN `accounts_roles` ON `roles`.id = `accounts_roles`.role_id 
  WHERE (`roles`.`id` = 9) 
    AND (`accounts_roles`.account_id = 6 ) LIMIT 1;

11:24:07  [SELECT - 0 row(s), 0.001 secs]  Empty result set fetched

这是我无法解释的部分。

如果我将 roles.id 更改为 * 我可以看到那里有数据。

SELECT * FROM `roles` 
  INNER JOIN `accounts_roles` ON `roles`.id = `accounts_roles`.role_id 
  WHERE (`roles`.`id` = 9) 
    AND (`accounts_roles`.account_id = 6 ) LIMIT 1;


id  name   authorizable_type  authorizable_id  created_at           updated_at  account_id  role_id  created_at           updated_at  
--  -----  -----------------  ---------------  -------------------  ----------  ----------  -------  -------------------  ----------  
9   owner  Couple             1                2010-11-30 11:13:31  (null)      6           9        2010-11-30 11:13:31  (null) 

为什么我选择的列会对返回的总行数产生影响?

这是有问题的两个表:

describe roles;

COLUMN_NAME        COLUMN_TYPE  IS_NULLABLE  COLUMN_KEY  COLUMN_DEFAULT  EXTRA           
-----------------  -----------  -----------  ----------  --------------  --------------  
id                 int(11)      NO           PRI         (null)          auto_increment  
name               varchar(40)  YES                      (null)                          
authorizable_type  varchar(30)  YES                      (null)                          
authorizable_id    int(11)      YES          MUL         (null)                          
created_at         datetime     YES                      (null)                          
updated_at         datetime     YES                      (null)    


describe accounts_roles;

COLUMN_NAME  COLUMN_TYPE  IS_NULLABLE  COLUMN_KEY  COLUMN_DEFAULT  EXTRA  
-----------  -----------  -----------  ----------  --------------  -----  
account_id   int(11)      YES          MUL         (null)                 
role_id      int(11)      YES          MUL         (null)                 
created_at   datetime     YES                      (null)                 
updated_at   datetime     YES                      (null)   

最佳答案

我会将查询转移到以下内容...因为“角色”主键是 ID 列,永远不会重复,所以 1 的限制是不必要的。此外,我会将您的帐户 ID 限定符转移到连接子句中。

SELECT 
      roles.id 
   FROM 
      roles
         INNER JOIN accounts_roles ar
            ON roles.id = ar.role_id
           AND ar.account_id = 6 ) 
   WHERE 
      roles.id = 9

关于mysql - 带有 INNER JOIN 的 SELECT 子句影响行数的奇怪行为? (MySQL 5.1.52),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5263425/

相关文章:

java - 发现另一个 JPA 奇怪的案例(添加一个 selected 属性完全改变了查询的结果集)

php - 学习 PHP PDO.. 想知道在涉及很多查询时使用它的正确方法

php - 在 PHP 中从数据库查询创建多维数组

android - 如何使用 OkHTTP(在 Android 上)在 MySQL 上存储原始数据类型

php - 如何从 mysql 记录中获取 "ID"编号并使用它使用 php 更新该记录?

mysql - Prestashop 数据库的相反 SQL 查询 |显示不在仓库中的产品

php - 如何从mysql记录中获取最后一个值

mysql - 从一个mysql数据库复制到另一个数据库并将表数据分离到不同的表中

php - Cakephp IN 条件绕过重复 ID 来获取数据

php - 用其他表值更新表