Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 这两个SQL查询返回不同的结果_Mysql_Sql - Fatal编程技术网

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使用”附近使用的正确语法是否有解决方案?是否有解决方案?