【问题标题】:Mysql query to Join two tablesMysql查询连接两个表
【发布时间】:2014-11-07 22:56:13
【问题描述】:

我正在编写一个简单的聊天服务。我想挑选两个人之间的消息线程,只有一个发送者和一个接收者使用他们的用户名或用户 ID。我在下面有我的查询。它有一个小问题,正在返回两次消息。我该如何解决这个问题?

例如,如果我的发件人有 uid '101' 而我的收件人有用户名'janed',我的查询是

SELECT * FROM chat LEFT JOIN users ON sender=uid OR receiver=uid  WHERE username='janed' OR (sender='101' AND receiver='janed') OR (sender='janed' AND receiver='101') ORDER BY msg_id ASC

用户表

---------------------------------
uid |fname  |mname  |username   |
---------------------------------
101 |John   |Doe    |jdoe       |
---------------------------------
102 |Jane   |Doe    |janed      |
---------------------------------
103 |Ann    |Other  |aother     |
---------------------------------

聊天表

---------------------------------------------
msg_id  |sender |receiver   |content        |
---------------------------------------------
1       |101    |102        | Hello Jane    |
---------------------------------------------
2       |102    |101        | Hello John    |
---------------------------------------------
3       |103    |101        | Hi John       |
---------------------------------------------

【问题讨论】:

  • 总的来说,我认为您可以通过 group by 解决您的问题。但是,您可能应该只查询发送方/接收方,因为拥有所有这些 OR 子句有点笨拙。

标签: mysql join left-join


【解决方案1】:
SELECT
    u.*, c.*
  FROM Users u
  LEFT JOIN Chat c ON (
    c.sender = u.uid OR c.receiver = u.uid
  )
  WHERE u.uid = 101 OR u.uid = 102 /* and/or other conditions */
  GROUP BY c.msg_id
  ORDER BY c.msg_id ASC

【讨论】:

  • 我想在单个用户和接收者之间进行选择。您的查询列出了聊天中的所有线程。我只想选择两个用户之间的消息
【解决方案2】:

添加GROUP BY 子句

SELECT 
    *
FROM
    chat
        LEFT JOIN
    users ON sender = uid OR receiver = uid
WHERE
    username = 'janed'
        OR (sender = '101' AND receiver = 'janed')
        OR (sender = 'janed' AND receiver = '101')
GROUP BY msg_id
ORDER BY msg_id ASC

【讨论】:

  • 当我使用数字代替用户名时,您的答案返回一行重复数据
  • 你能发布新的查询吗?
猜你喜欢
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
相关资源
最近更新 更多