Mysql 这两个SQL查询返回不同的结果
为什么这两个查询对角色给出不同的结果 正确的结果角色正确地关联到用户:Mysql 这两个SQL查询返回不同的结果,mysql,sql,Mysql,Sql,为什么这两个查询对角色给出不同的结果 正确的结果角色正确地关联到用户: SELECT users.*, activations.id AS activation (SELECT roles.name FROM roles INNER JOIN role_users ON roles.id = role_users.role_id WHERE role_users.user_id = users.id LIMIT 1) AS
SELECT
users.*,
activations.id AS activation
(SELECT
roles.name
FROM roles
INNER JOIN role_users ON roles.id = role_users.role_id
WHERE role_users.user_id = users.id
LIMIT 1) AS role
FROM users
LEFT JOIN activations ON users.id = activations.user_id
错误的结果角色始终是角色表的第一条记录:
我不能将第一个查询与角色\u users.user\u id=users.id一起使用,而必须将第二个查询与“JOIN”一起使用:如何获得正确的结果
谢谢
编辑:回答评论:
简而言之,我不能使用第一种查询方式,即我正在使用Laravel查询生成器构建它,并且表达式WHERE role\u users.user\u id=users.id,翻译成->WHERE'role\u users.user\u id','=','users.id',在Laravel查询生成器中无法工作,因为它的处理方式与role\u users.user\u id='users.id'相同。
我可以使用whereRaw,但我希望避免这种情况,并寻找更好的解决方案
我没有构建数据库模式,但它来自Cartalyst Sentinel;这是一个多对多的关系,但我注意每个用户只有一个角色,如果一个用户有多个角色,那么就使用第一个角色,因为有一个按角色排序的ORDER.id
您的子查询没有加入主查询,因此它没有将用户绑定在一起。试试这个:
SELECT
u.*,
activations.id AS activation
(SELECT
roles.name
FROM roles
INNER JOIN role_users ON roles.id = role_users.role_id
INNER JOIN users u1 ON u1.id = role_users.user_id AND u1.id = u.id
LIMIT 1) AS role
FROM users u
LEFT JOIN activations ON u.id = activations.user_id
您的子查询没有加入主查询,因此它没有将用户绑定在一起。试试这个:
SELECT
u.*,
activations.id AS activation
(SELECT
roles.name
FROM roles
INNER JOIN role_users ON roles.id = role_users.role_id
INNER JOIN users u1 ON u1.id = role_users.user_id AND u1.id = u.id
LIMIT 1) AS role
FROM users u
LEFT JOIN activations ON u.id = activations.user_id
第一个查询您正在使用来自外部查询的用户
SELECT
/
(SELECT
roles.name
FROM roles
INNER JOIN role_users ON roles.id = role_users.role_id
WHERE role_users.user_id = users.id
^^^^ -- external query user_id
LIMIT 1) AS role
FROM users --- you use this user, so each row has a different user_id
LEFT JOIN activations ON users.id = activations.user_id
第二个查询您从用户表中选择第一个角色,并且每一行都相同。第一个查询您使用的是外部查询中的用户
SELECT
/
(SELECT
roles.name
FROM roles
INNER JOIN role_users ON roles.id = role_users.role_id
WHERE role_users.user_id = users.id
^^^^ -- external query user_id
LIMIT 1) AS role
FROM users --- you use this user, so each row has a different user_id
LEFT JOIN activations ON users.id = activations.user_id
第二个查询从用户表中选择第一个角色,每一行都是相同的。什么意思我不能使用第一个查询,,,如果这给了你正确的结果,问题是什么?请注意,没有顺序的限制是一个毫无意义的概念。在这种情况下,我看不出限制应该做什么。简而言之,如果任何一个查询返回正确的结果,那都是出于运气,而不是出于意图。什么意思我不能使用第一个查询,,,如果这给了你正确的结果,问题是什么?请注意,没有顺序的限制是一个相当没有意义的概念。在这种情况下,我看不出限制应该做什么。简而言之,如果任何一个查询返回正确的结果,那都是出于运气,而不是出于意图。。。这是有道理的,但我得到了一个[Err]1066-不是唯一的表/别名:“users”编辑了SQL。请再试一次,让我知道这是否有效。这次我得到了:[Err]1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解第4Uhm行“SELECT roles.name FROM roles internal JOIN role_use”附近要使用的正确语法。。。这是有道理的,但我得到了一个[Err]1066-不是唯一的表/别名:“users”编辑了SQL。请再试一次,让我知道这是否有效。这次我得到了:[Err]1064-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解第4行“从角色内部连接角色中选择角色。名称\u使用”附近使用的正确语法是否有解决方案?是否有解决方案?