jjzjj

php - 选择所有匹配的两个字段并用 mysql 按这两个字段分组

coder 2023-10-11 原文

我有一个消息系统,它兼作消息系统和聊天系统,它们通过称为源的字段来区分。

我对消息部分进行了正确的排序和分组,但是在聊天部分中它没有相应地对这些部分进行分组,请参阅下面的 SQL:

SELECT * 
FROM messages
WHERE ( senderID = "1" OR receiverID = "1" ) 
AND source = "1" 
GROUP BY receiverID, senderID 
ORDER BY addedDate DESC LIMIT 10

所以我期望的结果是每场比赛只有一个,即每次对话一个

但是由于某种原因我得到了两个。

提前致谢

最佳答案

每次聊天您可能会得到两个答案,因为每个人都处于两个位置

ChatID  Sender Receiver
1       1      2
2       2      1
3       1      2
4       2      1

So, you'll have a record grouped by 
Sender / Receiver
1        2         and
2        1

我认为您正在寻找的是对话中不同的人,无论他们处于什么位置,上述内容都应被视为“一次聊天”。要纠正这一点,我会做类似...

select 
      PreQuery.*,
      m2.Message,
      m2.SenderID,
      m2.ReceiverID
   from
      ( SELECT 
              if( m.senderID < m.receiverID, m.senderID, m.receiverID ) as Person1,
              if( m.senderID < m.receiverID, m.receiverID, m.senderID ) as Person2,
              max( m.ID ) as LastMessageIDPerChat,
              max( m.AddedDate ) as LastMessageDate
           FROM 
              messages m
           WHERE 
                  m.Source = "1"
              AND "1" IN ( SenderID, ReceiverID )
           GROUP BY
              Person1, 
              Person2
           ORDER BY 
              m.AddedDate DESC 
           LIMIT 10 ) PreQuery

         JOIN Messages m2
            on PreQuery.LastMessageIDPerChat = m2.ID

这将确保较低的 ID 始终位于第一个位置,而较高的 ID 始终位于第二个位置,以防止如上所述的错误重复。

另请注意... GROUP BY 通常期望所有非分组依据字段都与某些聚合相关联,否则,它只会获取符合条件的记录的第一个实例。因此,如果您想在不同日期的对话中包含相同的人,您需要将“AddedDate”添加到组中,这样它就可以......

Person1   Person2  on 4/20
Person1   Person3  on 4/20
Person3   Person4  on 4/20
Person1   Person2  on 4/18
Person1   Person5  on 4/17
Person3   Person4  on 4/15

要获取最后发送者的状态,我必须将每个对话的配对人查询包装起来,并获取该对话的最后一个 ID。然后,获取并重新加入该 ID 上的消息(如果 ID 实际上是消息表的主键 ID,请根据需要进行调整)。从连接中,我可以获得对话的最后一条消息以及该交易的发送者 ID 和接收者 ID(以及您希望从现在的别名“m2”引用中获得的任何其他数据)。

关于php - 选择所有匹配的两个字段并用 mysql 按这两个字段分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10350734/

有关php - 选择所有匹配的两个字段并用 mysql 按这两个字段分组的更多相关文章

  1. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  4. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  5. ruby - 匹配未转义的平衡定界符对 - 2

    如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

  6. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  7. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  8. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  9. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  10. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

随机推荐