/ALL/ANY子查询中的MySQL列“id”不明确
我试图做一个搜索功能,涉及三个表 搜索用户并返回用户id 1是否为返回用户的朋友。还将从第三个表中筛选返回的用户,该表将检查该用户的标记 所以我可以说,返回标记为“Programming”、“Php”的用户 在userinterests表中,以及返回的用户是否是usr id 1的朋友 我试图使用下面的查询,但在/ALL/ANY子查询中获取列“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.
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')