具有INNER JOIN的SELECT子句影响行计数的奇怪行为? (MySQL 5.1.52)

时间:2011-03-10 17:29:51

标签: 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)   

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我会把这个问题放在一个可能为其他人省下一些时间和理智的机会中。看起来这是我使用的MySQL版本中的一个错误。

<强>失败

$ mysql -v
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.52 Source distribution

正常工作

$ mysql -v
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.55 Source distribution

我应该在几年前把这个应用移植到postgres。