【问题标题】:Using left join with multiple conditions SQL使用带多个条件 SQL 的左连接
【发布时间】:2019-01-30 06:05:17
【问题描述】:

我正在尝试制作一个应用程序,该应用程序将显示不是登录用户或登录用户未关注的所有其他用户(如探索页面),但我在编写 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

很遗憾,此查询当前正在返回我的所有用户,但它不应该返回。由于某种原因,我在处理这个逻辑时遇到了很多问题,有人有什么见解吗?

【问题讨论】:

  • 样本数据及其输出很有帮助
  • 了解左连接返回什么:内连接行加上由空值扩展的不匹配左表行。作为左连接的一部分,始终知道您想要什么样的内连接。

标签: sql outer-join


【解决方案1】:

这将显示不是logged in user 和(不是或)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';

【讨论】:

    【解决方案2】:

    如果您需要获取所有未登录用户关注的用户,只需尝试以下脚本。

    SELECT * FROM
    users u 
    where u.username in(select username2 from following where username1!= 'loggedInUser')
    and u.username!='loggedInUser'
    

    【讨论】:

      【解决方案3】:
      SELECT * FROM
      users u 
      LEFT JOIN following f ON u.[insert_primary_key_here]=f.[insert_foreign_key_here] 
      WHERE u.username != 'loggedInUser'
      AND f.username1 = 'loggedInUser'
      AND f.username2 = u.username
      

      【讨论】:

        【解决方案4】:

        为什么不简单地在位类型的用户中创建一个新列,该列将在任何用户登录时更新。然后你只需要编写一个简单的查询

        从 login=1 的用户中选择 *

        这将返回您所有登录状态的用户数据

        【讨论】:

        • 这似乎没有解决问题的要点,即包括following 表中链接的用户。
        • 我已经向她解释了另一种工作方式,这可能对她有所帮助。有多种方法可以做同样的事情,我已经向她解释了简单有效的方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        • 2014-04-05
        • 2010-11-10
        • 1970-01-01
        • 2015-05-13
        • 2018-12-06
        • 1970-01-01
        相关资源
        最近更新 更多