【问题标题】:SQL Union or other table joinSQL Union 或其他表连接
【发布时间】:2013-05-14 09:00:04
【问题描述】:

我在思考一个 SQL 查询时遇到了麻烦,试图找出一些东西。

很快,这是我的(简单)表格: 它是在社交网站中添加的朋友的代表。 我必须使用这样的表格格式,user1和user2都是主键。

          User1       |       User2
    --------------------------------------
      foo@a.com       |   things@stuff.com
      foo@a.com       |   lala@hi.com
      things@stuff.com|   lol@k.com
      lol@k.com       |   foo@a.com
      foo@a.com       |   lol@k.com

我需要做的是编写一个 SELECT 语句,该语句将返回所有与 foo@a.com 成为朋友的唯一用户。

SELECT User2
FROM members 
WHERE User1 = 'things@stuff.com'

将返回 lol@k.com 而不是 foo@a.com,即使我需要它来返回后者。

SELECT *
FROM members
WHERE User1 = 'foo@a.com'
OR User2 = 'foo@a.com'

我认为会返回错误吗?可能会选择多列。

所以我认为联合加入或其他一些加入是必要的(联合所以没有重复?)但我真的不知道如何去做。

我正在尝试在 PHP 中实现这一点,所以即使我写的最后一个查询有效,我不确定如何根据返回的 User1 或 User2 来回显/如果有意义的话我需要哪个。

【问题讨论】:

  • 你用 SQL 检查两列应该没问题(除了朋友可能不是唯一的,具体取决于数据)。尽管您可能可以将其拆分为 2 个查询,每列一个,合并在一起,但只是出于性能原因(允许两者都使用索引)

标签: mysql sql join union


【解决方案1】:

使用 UNION(为了性能):-

SELECT User2
FROM members
WHERE User1 = 'foo@a.com'
UNION
SELECT User1
FROM members
WHERE User2 = 'foo@a.com'

【讨论】:

    【解决方案2】:

    为列使用alias 名称

    SELECT User2 AS friend
    FROM members 
    WHERE User1 = 'things@stuff.com'
    UNION
    SELECT User1 AS friend
    FROM members 
    WHERE User2 = 'things@stuff.com'
    

    现在你可以回显friend

    HTH

    【讨论】:

      【解决方案3】:

      这完全取决于您如何定义两个用户之间的关系。

      例如,您有一个表条目,其中 User1 = 'foo@a.com' 和 User2='mumu@f.com'。这是什么意思?这是否意味着用户 foo 与 mumu 成为了朋友? “友谊”的方向重要吗?

      如果答案是否定的,您只想获取其中任一用户为 foo 的所有行,那么您的查询

          SELECT *
      FROM members
      WHERE User1 = 'foo@a.com'
      OR User2 = 'foo@a.com'
      

      是正确的。

      但是,要获取数据,您需要浏览两列以获得结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-23
        • 2011-09-29
        • 1970-01-01
        • 2021-09-30
        • 1970-01-01
        • 2018-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多