【问题标题】:SQL Query Inner Join and ORSQL 查询内连接和 OR
【发布时间】:2018-03-23 12:32:06
【问题描述】:

如何使用INNER JOINOR 进行选择,我尝试使用以下查询,但它没有返回任何内容,也没有错误

SELECT * FROM chatroom_message cm
INNER JOIN users_account ua
ON cm.userid_a = ua.reg_userid 
OR cm.userid_b = ua.reg_userid 
WHERE cm.userid_a = :chat_client OR cm.userid_b = :chat_client

【问题讨论】:

  • 我根据参数格式添加了oracle标签。如果该假设不正确,请更改它。
  • 据我所知,它不是这样工作的,OR 会过滤,你可以使用 Union 代替,看看这是否有帮助:stackoverflow.com/questions/19725014/…
  • 您是否获得了没有 where 线索的结果?我怀疑 :chat_client 无效

标签: sql oracle


【解决方案1】:
SELECT * 
FROM chatroom_message cm INNER JOIN users_account ua ON cm.userid_a = ua.reg_userid 
INNER JOIN users_account ub ON cm.userid_b = ub.reg_userid 
WHERE cm.userid_a = :chat_client OR cm.userid_b = :chat_client

这里的变化是 2 个连接,用户表上每个用户一个连接。这是因为您在消息表中有 2 个不同的用户 ID(没有人与自己聊天),因此您需要一个 userid_a 的连接和另一个 userid_b 的连接。

您的连接实际上返回了 0 条记录,因为 userid_a 永远不会等于 userid_b。此外,您不希望在 this 查询的 WHERE 子句中使用 OR

WHERE 子句很好。

【讨论】:

  • 这行得通,请问我还有另一个问题,我想请您帮忙吗?
  • @PhilipJems - 15 分钟宽限期到期后,请考虑使用右侧的复选标记标记答案。如果您还有其他问题,请在Stack Overflow 上发布新问题,向现有问题添加新问题通常是不受欢迎的,除非它密切相关或在发现过程中出现(即有人在cmets 部分,您正在回答他们,但对此有疑问)。
  • 我很惊讶这被接受了。 OP查询中的join应该没有问题,因为它是OR而不是ANDON cm.userid_a = ua.reg_userid OR cm.userid_b = ua.reg_userid。因此,将选择 either userid_amatching or userid_b 匹配的记录。
  • @ThorstenKettner - 我认为 JOIN 子句中的 OR 实际上是 ON 但被错误地复制/粘贴。
【解决方案2】:

Igor 的回答是直截了当的方法,但我正在考虑摆脱OR,这通常与较差的性能相关联,并联合每个reg_userid 的结果。类似于以下内容:

SELECT * FROM chatroom_message cm
INNER JOIN users_account ua ON cm.userid_a = ua.reg_userid 
WHERE cm.userid_a = :chat_client
UNION ALL
SELECT * FROM chatroom_message cm
INNER JOIN users_account ua ON cm.userid_b = ua.reg_userid 
WHERE cm.userid_b = :chat_client

虽然这可能会更快,但特定 chatroom_message 的数据稍微难以获取,因为它分为 2 条记录。这取决于您之后如何处理这些数据。

【讨论】:

  • 其实我在我的系统中使用了你的代码,但是我将他标记为已回答,因为他的回答是第一个
【解决方案3】:

您需要两个内部连接才能工作——一个用于 userid_a,另一个用于 userid_b。

【讨论】:

    【解决方案4】:

    假设:chat_client = 123。然后,您将选择所有chatroom_message 记录,其中userid_a = 123 加上所有chatroom_message 记录,其中userid_b = 123

    userid_a userid_b 111 222

    这些记录你加入users_account。这让你:

    userid_a userid_b 用户名 333 123 先生 333 333 123 先生 123 123 444 先生 123 123 444 444先生

    因此,如果您没有得到任何记录,那么用户 123 根本就没有 chatroom_message 记录(或者 users_account 中没有匹配的条目,由于外键限制,这应该是不可能的。

    查询没问题。检查您的参数和数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-19
      • 2016-03-29
      • 2015-06-21
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      相关资源
      最近更新 更多