/ALL/ANY子查询中的MySQL列“id”不明确

/ALL/ANY子查询中的MySQL列“id”不明确,mysql,sql,rdbms,Mysql,Sql,Rdbms,我试图做一个搜索功能,涉及三个表 搜索用户并返回用户id 1是否为返回用户的朋友。还将从第三个表中筛选返回的用户,该表将检查该用户的标记 所以我可以说,返回标记为“Programming”、“Php”的用户 在userinterests表中,以及返回的用户是否是usr id 1的朋友 我试图使用下面的查询,但在/ALL/ANY子查询中获取列“id”是不明确的 如果我删除左连接,那么它会工作 SELECT n.id, n.firstName, n.lastName, t.id, t.tag, t.

我试图做一个搜索功能,涉及三个表

搜索用户并返回用户id 1是否为返回用户的朋友。还将从第三个表中筛选返回的用户,该表将检查该用户的标记

所以我可以说,返回标记为“Programming”、“Php”的用户 在userinterests表中,以及返回的用户是否是usr id 1的朋友

我试图使用下面的查询,但在/ALL/ANY子查询中获取列“id”是不明确的 如果我删除左连接,那么它会工作

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')

感谢您抽出时间:

请确认您所有的列名。您似乎知道这一点,因为所有其他列名都是限定的

我不确定您的逻辑是否正确,但您可以通过限定列名来修复错误:

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 
. . . 

这就是我将采用的方法:

1对于与标记(编程和Php)无关的跳过用户,我使用了内部连接而不是左连接

2我替换了逻辑以查找与id等于1的用户相关的朋友集


只是好奇,status=2的含义是什么?

qualify id in。。。如果。。。作为t.id或n.id,无论它应该是哪个表。在select中的where子查询中使用Case/when似乎是一个非常糟糕的主意。有一个问题,在结果查询中是否需要所有没有标记编程和Php的用户,因为如果没有,您可以用内部连接替换左连接。啊,这很好,条件必须匹配,所以我应该使用内部连接谢谢谢谢谢谢,我刚刚更正了我的查询,现在正在工作。你能解释一下你加入corss的情况吗?它比我写的好吗?我试过你的,但用这个给我一个错误…案例当n.id在选择u.id作为id从朋友f交叉加入用户u时,案例当f.following\u id=1时。。。。。。。。结束,f.status=2,然后“是”或“否”结束为来自用户的isFriend n。。在“字段列表”中为我提供未知列“f.status”,如果我删除“f.status”,则它会工作。@sadek。您应该使用显式联接。我也不建议在where子句中使用case。但您的问题是关于修复特定错误,而不是编写查询的最佳方式。status=2表示用户是朋友还是在阻止列表中。一个问题,如果有任何标记匹配,我是否要选择用户?就像用户可以使用“编程”或“Php”一样,这只是IN的逻辑,1/1,2将计算为true,2/1,2也将计算为true。标记列是一个简单的标记还是一组标记?标记是动态的,可以选择多个标记。我不确定你对1的意思,2只是一个用虚拟值来显示运算符逻辑的例子。在您的例子中,“编程”中的“Php”将计算为true,“编程”中的“Programming”也将计算为true。现在,如果列标记有多个标签,比如编程、C++、JavaScript、PHP,则不能在“编程”、“PHP”中使用T.tag。在这种情况下,必须使用正则表达式:t.tag REGEXP'Programming | Php'
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')