我正在尝试创建一个应用程序,该应用程序将显示不是登录用户的其他所有用户,或者不跟随登录用户的用户(例如浏览页面),但是我在编写SQL查询时遇到问题
我的表格设置为:
following(username1, username2)
(意味着用户名1跟随用户名2)
和
users(username, fullname, ...)
现在我正在尝试执行以下操作:
SELECT * FROM
users u
LEFT JOIN following f ON (
u.username != 'loggedInUser'
AND f.username1 = 'loggedInUser'
AND f.username2 = u.username
)
我在Python脚本中替换了loggedInUser
。
不幸的是,此查询当前正在返回我的所有用户,而实际上并非如此。尽管由于某种原因,这种逻辑仍然存在很多问题,但是有人有见识吗?
答案 0 :(得分:1)
这将显示不是logged in user
的所有其他用户,并且(not or)logged in user
不跟随的用户(他们):
SELECT *
FROM users u
WHERE u.username <> 'loggedInUser'
AND NOT EXISTS (
SELECT 1
FROM following f
WHERE f.username1 = 'loggedInUser'
AND f.username2 = u.username
);
您的查询可以更改为INNER JOIN
以获得预期的结果,但是它可能更复杂且性能更差:
SELECT DISTINCT u.*
FROM users u
INNER JOIN following f
ON f.username1 <> 'loggedInUser'
OR f.username2 <> u.username
WHERE u.username <> 'loggedInUser';
答案 1 :(得分:1)
如果需要让所有用户都不要跟随已登录用户,请尝试以下脚本。
SELECT * FROM
users u
where u.username in(select username2 from following where username1!= 'loggedInUser')
and u.username!='loggedInUser'
答案 2 :(得分:0)
public class DeleteRepeatingNumbers {
public static void deleteRepeatingNumber() {
StringBuilder sb = new StringBuilder();
try (Scanner sc = new Scanner(new FileInputStream("resources\\RepeatingNumberTest.txt"), "UTF-8")) {
Set<Integer> dontRepeatedNumbers = new HashSet<>();
while (sc.hasNext()) {
dontRepeatedNumbers.add(sc.nextInt());
}
dontRepeatedNumbers.stream().forEach((Integer number) -> {
sb.append(String.valueOf(number));
sb.append(System.getProperty("line.separator"));
});
} catch (IOException e){
System.out.println(e);
}
try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("resources\\RepeatingNumberTest_Output.txt"), "utf-8"))) {
writer.write(sb.toString());
} catch (IOException e){
System.out.println(e);
}
}
}
答案 3 :(得分:-1)
为什么不简单地在位类型的用户中创建一个新列,该列将在任何用户登录时更新。然后,您只需要编写一个简单的查询
从loginIn = 1的用户中选择*
将以登录状态返回所有用户数据