我遇到了一个我无法解释的测试用例的奇怪问题。它归结为一个查询,它应返回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)
答案 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。