对多个条件使用左联接SQL

时间:2019-01-30 06:05:18

标签: sql outer-join

我正在尝试创建一个应用程序,该应用程序将显示不是登录用户的其他所有用户,或者不跟随登录用户的用户(例如浏览页面),但是我在编写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

不幸的是,此查询当前正在返回我的所有用户,而实际上并非如此。尽管由于某种原因,这种逻辑仍然存在很多问题,但是有人有见识吗?

4 个答案:

答案 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的用户中选择*

将以登录状态返回所有用户数据