【问题标题】:get all rows matching for same value in 2 different columns获取在 2 个不同列中匹配相同值的所有行
【发布时间】:2013-11-02 09:15:36
【问题描述】:

我有 2 张桌子,memberschat

我想获取所有与$user_id聊天的会员id,这里我们假设$user_id = '5'

chat 表是这样的:

id     from    to     message
1      32      12     test
2      25      18     new message
3      5       86     another message
4      53      5      final message

members表:

id user_id
1  1
2  2
3  3
4  4
5  5

...

所以对于上面的表格内容,我的查询应该返回 5386 因为只有这些用户 ID 与“5”聊天

我的查询是:

$q = "
SELECT members.user_id
FROM members
LEFT JOIN chat ON chat.to = '5' OR chat.from = '5'
"

预期输出是:

user_id
86
53

但它不起作用,我怎么能做到这一点? 谢谢

【问题讨论】:

  • 发布成员表脚本 :)
  • 成员表字段在哪里?
  • 重命名列 fromto,因为它们是 reserved keywords
  • 如果members表一直id=user_id,你可以考虑只有一行,去掉第二行
  • @AycanYaşıt 感谢您提醒关键字

标签: mysql sql


【解决方案1】:

join 子句必须包含一个成员字段和一个聊天字段。但是您可能更喜欢这种方式来编写查询:

$q = "
SELECT CASE chat.to WHEN 5 THEN chat.from ELSE chat.to END as the_other_guy
FROM chat
WHERE chat.from = 5 OR chat.to = 5";

编辑:下一次,请在您的问题中询问您真正需要什么,因为我们无法猜测您想要什么。 “显示与用户 5 交谈的成员的 id 和用户名”会比您的第一个标题“如何加入 2 个表”更清楚

$q = "
SELECT CASE chat.to WHEN 5 THEN chat.from ELSE chat.to END as the_other_guy, username
FROM chat, members
WHERE 
  (chat.from = 5 AND members.id=chat.to) 
OR (chat.to = 5 AND members.id=chat.from)";

【讨论】:

  • 确实,我使用了您的第二个问题的查询:您正在寻找chat.id 而不是members.id。我编辑了
  • 我想要与5有联系的用户id,新代码返回一个不相关的id
  • 看,所有收到5消息或发送消息给5的用户id,这就是我需要的
  • 那么它返回了什么?
  • 哦,我明白了,你想要其他成员的 id,对不起
【解决方案2】:

我想你正在寻找这个:

select chat.to from chat where chat.from=5
union
select chat.from from chat where chat.to=5

表示 user:5 与之聊天的每个 user_id

【讨论】:

  • +1,这比我提出的解决方案简单多了,+你可能不需要join
【解决方案3】:
$q = "
SELECT m.id
FROM members as m
LEFT JOIN chat as c 
  ON c.to = m.user_id OR c.from = m.user_id
WHERE m.user_id = '5'
"

【讨论】:

  • 我认为聊天 ID 和会员 ID 不匹配。
猜你喜欢
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
相关资源
最近更新 更多