如何在子联合查询中传递父字段

时间:2017-04-14 09:00:27

标签: mysql sql

我有这个查询,并且它在where子句中给出了一个未知U.UserID列的错误但我看不到任何错误,因为我的Users表实例是U

SELECT  GROUP_CONCAT(U.UserID),
        (
            SELECT  COUNT(DISTINCT(UserID))
            FROM    (
                        SELECT  FriendID as UserID
                        FROM    Friends
                        WHERE   UserID=U.UserID AND Status=1
                        UNION All
                        SELECT  UserID
                        FROM    Follow
                        WHERE   Type='user' AND TypeEntityID=U.UserID
                    ) tbl
        ) as NoOfFriendsFollow
FROM    `Users` `U`
WHERE   `U`.`UserID` IN('1')
LIMIT   10

此查询的任何解决方案或让我知道我错在哪里

2 个答案:

答案 0 :(得分:0)

SELECT GROUP_CONCAT(UserID), 
(
    SELECT COUNT(DISTINCT(UserID)) FROM 
    (
        SELECT FriendID as UserID FROM Friends F
        INNER JOIN Users U ON U.UserID=F.FriendID
        WHERE F.Status=1 
        UNION All 
        SELECT FF.UserID FROM Follow FF
        INNER JOIN Users U ON U.UserID=FF.UserID
        WHERE Type='user' AND TypeEntityID=U.UserID 
    ) tbl
) as NoOfFriendsFollow 
FROM Users WHERE UserID IN('1') LIMIT 10;

试试上面的代码。 希望这会有所帮助。

答案 1 :(得分:0)

不幸的是,MySSQL不允许你使用外部表引用"两个级别下来"。所以你可以这样做:

SELECT U.UserID,
       (SELECT COUNT(DISTINCT UserID)
        FROM (SELECT fr.FriendID as UserID, fr.FriendId as compareId
              FROM Friends fr
              WHERE fr.Status = 1
              UNION All
              SELECT f.UserID, f.TypeEntityID as compareId
              FROM Follow f
              WHERE f.Type = 'user'
             ) tbl
         WHERE tbl.UserID = compareId
        ) as NoOfFriendsFollow
FROM Users U
WHERE U.UserID IN (1)
LIMIT 10;

注意:

  • 这会将比较移动到中间子查询中,因此查询将解析。
  • 据推测UserId是一个整数。仅对字符串和日期常量使用单引号。
  • GROUP_CONCAT()没有意义。它将查询转换为仅返回一行的聚合查询。
  • 我需要加倍LIMIT。每个UserId应该有一行。
  • 如果查询中有多个表,请始终使用限定列名。