简体   繁体   中英

MySQL Column 'id' in IN/ALL/ANY subquery is ambiguous

I am trying to do a search functionalities that involves three tables.

Searching for users and returning wheather the user id 1 is a friend of the returned users. Also The returned users is being filtered from a third table where it checks tag of that users.

So I can say, "Return users who has tag 'Programming', 'Php' in userinterests table and also if the returned user is a friend of usr id 1 or not "

I am trying to use the bellow query but getting Column 'id' in IN/ALL/ANY subquery is ambiguous If I remove the left join then it works.

SELECT n.id, n.firstName, n.lastName, t.id, t.tag, t.user_id, if(id in (
        SELECT u.id as id from friends f, users u 
        WHERE CASE 
        WHEN f.following_id=1
        THEN f.follower_id = u.id 
        WHEN f.follower_id=1
        THEN f.following_id = u.id
        END 
        AND
        f.status= 2
    ), "Yes", "No") as isFriend 
FROM users n
LEFT JOIN userinterests t on  n.id = t.id

WHERE t.tag in ('Programming', 'Php')

Thank you for your time :)

Qualify all your column names. You seem to know this, because all other column names are qualified.

I'm not sure if your logic is correct, but you can fix the error by qualifying the column name:

SELECT . . . 
       (CASE WHEN n.id IN (SELECT u.id as id 
                           FROM friends f CROSS JOIN
                                users u 
                           WHERE CASE WHEN f.following_id=1
                                      THEN f.follower_id = u.id 
                                      WHEN f.follower_id=1
                                      THEN f.following_id = u.id
                                 END 
                           ) AND
                 f.status= 2
             THEN 'Yes' ELSE 'No'
        END) as isFriend 
. . . 

This is the way I will go for your approach:

1) I used INNER JOIN instead of LEFT JOIN for skip users that are not related to tags: Programming and Php .

2) I replaced the logic to find the set of friends related to user with id equal to 1 .

SELECT
    n.id,
    n.firstName,
    n.lastName,
    t.id,
    t.tag,
    t.user_id,
    IF(
        n.id IN (SELECT follower_id FROM friends WHERE status = 2 AND following_id = 1
                 UNION
                 SELECT following_id FROM friends WHERE status = 2 AND follower_id = 1),
        "Yes",
        "No"
    ) AS isFriend
FROM
    users n
INNER JOIN
    userinterests t ON n.id = t.id AND t.tag IN ('Programming', 'Php')

Just curious, whats is the meaning of status = 2 ?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM