簡體   English   中英

MySQL相關子查詢:無法解析外部表中的名稱

[英]MySQL correlated subquery: can't resolve name in outer table

我需要獲得角色名稱最高的用戶列表。 由於某些情況,一個用戶只有一個角色。 所以我有一些相同的用戶

CONCAT(first_name, last_name) 

但具有不同的ID。 最高角色可以簡單地找到,只需按升序對所有用戶角色進行排序並獲得第一個即可。 因此,我決定使用相關子查詢來為適當的用戶獲得最高的角色ID。

但是在執行以下查詢時

SELECT 
    u.id                    AS UserID,
    u.user_name             AS UserName,
    u.user_hash             AS Hash,
    u.first_name            AS FirstName,
    u.last_name             AS LastName,
    u.phone_mobile          AS PhoneMobile,
    u.address_city          AS City,
    u.address_state         AS State,
    ar.name                 AS RoleName
FROM
    users AS u
        JOIN
    acl_roles_users AS aru ON (u.id = aru.user_id AND aru.deleted = 0)
        JOIN
    acl_roles AS ar ON aru.role_id = ar.id
        JOIN
            (SELECT 
                ar2.id AS RoleID
            FROM
                users AS u2
            JOIN acl_roles_users AS aru2 ON (u2.id = aru2.user_id
                and aru2.deleted = 0)
            JOIN acl_roles AS ar2 ON (aru2.role_id = ar2.id
                AND ar2.deleted = 0)
            WHERE
                concat(u2.first_name, u2.last_name) = concat(u.first_name, u.last_name)
            ORDER BY ar2.name ASC
            LIMIT 1) AS temptbl ON RoleID = ar.id
WHERE
    u.status = 'Active' and u.deleted = 0
ORDER BY UserName
LIMIT 1000000; 

我收到一條錯誤消息

Error Code: 1054. Unknown column 'u.first_name' in 'where clause'

為什么在子查詢中無法解析“ u”(用戶)表? 有什么想法可以重寫查詢嗎?

您的查詢不是corelated subquery temptbl ,無法查看u.first_name

如何使用EXISTS

SELECT 
    u.id                    AS UserID,
    u.user_name             AS UserName,
    u.user_hash             AS Hash,
    u.first_name            AS FirstName,
    u.last_name             AS LastName,
    u.phone_mobile          AS PhoneMobile,
    u.address_city          AS City,
    u.address_state         AS State,
    ar.name                 AS RoleName
FROM
    users AS u
        JOIN
    acl_roles_users AS aru ON (u.id = aru.user_id AND aru.deleted = 0)
        JOIN
    acl_roles AS ar ON aru.role_id = ar.id
WHERE
    u.status = 'Active' and u.deleted = 0
    AND EXISTS 
            (SELECT 
                1
            FROM
                users AS u2
            JOIN acl_roles_users AS aru2 ON (u2.id = aru2.user_id
                and aru2.deleted = 0)
            JOIN acl_roles AS ar2 ON (aru2.role_id = ar2.id
                AND ar2.deleted = 0)
            WHERE
                concat(u2.first_name, u2.last_name) = concat(u.first_name, u.last_name)
                AND ar2.id = ar.id
            ORDER BY ar2.name ASC
            LIMIT 1)
ORDER BY UserName
LIMIT 1000000; 

您無法在子查詢中獲取“ u”字段...也許您可以嘗試以下操作:

SELECT 
    u.id                    AS UserID,
    u.user_name             AS UserName,
    u.user_hash             AS Hash,
    u.first_name            AS FirstName,
    u.last_name             AS LastName,
    u.phone_mobile          AS PhoneMobile,
    u.address_city          AS City,
    u.address_state         AS State,
    ar.name                 AS RoleName
FROM
    users AS u
        JOIN
    acl_roles_users AS aru ON (u.id = aru.user_id AND aru.deleted = 0)
        JOIN
    acl_roles AS ar ON aru.role_id = ar.id
        JOIN
            (SELECT 
                ar2.id AS RoleID
            FROM
                users AS u2
            JOIN acl_roles_users AS aru2 ON (u2.id = aru2.user_id
                and aru2.deleted = 0)
            JOIN acl_roles AS ar2 ON (aru2.role_id = ar2.id
                AND ar2.deleted = 0)
            ORDER BY ar2.name ASC
            LIMIT 1) AS temptbl ON RoleID = ar.id 
            AND concat(temptbl.first_name, temptbl.last_name) = concat(u.first_name, u.last_name)
WHERE
    u.status = 'Active' and u.deleted = 0
ORDER BY UserName
LIMIT 1000000; 

如果這對您不起作用,也許您可​​以為http://sqlfiddle.com/提供表結構和一些偽數據...

由於角色名稱保留在VARCHAR列中,因此看起來像

  • '01 Mega boss',
  • '02超級老板',
  • '03 Standard Boss',
  • '04微型老板',
  • 等等

我只是重寫了一點@Inos Heo版本以獲得正面結果:

SELECT u.id            AS UserID, 
       u.user_name     AS UserName, 
       u.user_hash     AS Hash, 
       u.first_name    AS FirstName, 
       u.last_name     AS LastName, 
       u.phone_mobile  AS PhoneMobile, 
       u.address_city  AS City, 
       u.address_state AS State, 
       ar.name         AS RoleName 
FROM   users AS u 
       JOIN acl_roles_users AS aru 
         ON ( u.id = aru.user_id 
              AND aru.deleted = 0 ) 
       JOIN acl_roles AS ar 
         ON aru.role_id = ar.id 
WHERE  u.status = 'Active' 
       AND u.deleted = 0 
       AND NOT EXISTS(SELECT 1 
                      FROM   users AS u2 
                             JOIN acl_roles_users AS aru2 
                               ON ( u2.id = aru2.user_id 
                                    AND aru2.deleted = 0 ) 
                             JOIN acl_roles AS ar2 
                               ON ( aru2.role_id = ar2.id 
                                    AND ar2.deleted = 0 ) 
                      WHERE  Concat(u2.first_name, u2.last_name) = 
                             Concat(u.first_name, u.last_name) 
                             AND ar2.id < ar.id 
                      ORDER  BY ar2.name ASC 
                      LIMIT  1) 
ORDER  BY Concat(lastname, firstname) 
LIMIT  1000000; 

注意在子查詢WHERE子句中使用NOT NOTISTS和LESS THAN登錄。 即與外部查詢相比,過濾出角色“少於”的行。

謝謝@Inos Heo指出正確的方向!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM