[英]MySQL Correlated Subqueries: Subquery cant find table from outer query?
[英]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列中,因此看起來像
我只是重寫了一點@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.