【问题标题】:MySQL - group by with 2 keysMySQL - 用 2 个键分组
【发布时间】:2012-06-22 20:45:05
【问题描述】:

假设您有一个MySQL Database Schema、一个from_id 和一个to_id,它们都代表数字用户ID。上下文是类似于聊天的基于文本的对话。

querydatabase 如何选择user 1 和他/她与之对话的所有其他用户之间最后交换的所有消息的列表?

【问题讨论】:

  • 如果您只想查看涉及该用户的所有消息,那么 GROUP BY 在哪里出现?
  • 请提供示例数据和所需的输出。
  • @RedFilter 不仅仅是两个用户之间,它是两个用户之间交换的最后一条消息,一个是登录用户,另一个是其他任何人。它应该检索一个列表,其中每个对话伙伴只有一行。
  • 为什么需要 Group By? 'where from_id =1 or to_id' 就足够了
  • @Maksym Polshcha 我需要一个解决方案,最重要的是。该方法为我提供了登录用户和所有其他用户之间交换的消息列表,而不是登录用户和其他用户交换的最后一条消息。最后一个,不是全部。

标签: mysql database-schema


【解决方案1】:
SELECT * FROM TABLENAME WHERE from_id = USERID1 OR to_id = USERID1 

您可能希望将所需的列放在“*”的位置以获得更好的性能。

如果您有日期时间字段,您也可以按该字段进行搜索。

【讨论】:

  • 这不按预期工作,将返回一个列表,其中包含在相同用户之间交换的多个消息。
  • 你需要更好地解释你之后的情况。这将获取用户在 from_id 或 to_id 中的所有行。从你上面提到的我理解的就是这些。
  • 你知道facebook消息吗?当您打开它时,您只会看到与您进行对话的每个用户的 1 条消息,即最后一条。
【解决方案2】:

如果您需要 1 个用户:

SELECT * FROM TABLENAME 
WHERE from_id = USERID1 OR to_id = USERID1 
ORDER BY `timestamp` DESC
LIMIT 1

这里timestamp - 你的时间戳字段。

对于所有用户:

select text, id, ts 
from (select text, from_id as id,ts from chat union select text, to_id as id,ts from chat) T 
group by id 
having ts=max(ts)

这里 ts - 时间戳

【讨论】:

  • 不起作用。为什么需要greatestleast?这些字段是 ID。
  • #1248 - Every derived table must have its own alias
  • @yoda 实际上是的,我忘记添加别名。更新
  • 它仍然不起作用,FROM 选择器中的某些内容不正确。
  • 不起作用。结果的数量是预期的,但返回的数据不正确,并且由于某种原因是混合的(一行的文本与另一行的 id 相关联)。我最终用 2 个查询和一些服务器端脚本解决了这个问题。它不漂亮,但它有效。
猜你喜欢
  • 1970-01-01
  • 2021-09-07
  • 2016-09-03
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
相关资源
最近更新 更多