mysql - 外连接与搜索以及分组依据相结合的问题

标签 mysql sql database

我正在尝试通过查询做两件事。

1) 返回一个表中的工单主题以及另一个表中的匹配消息。这是一对多关系,我希望返回显示主题以及每个主题连接的所有消息。

2) 能够针对搜索字符串搜索主题及其所有注释。

3)某些主题没有消息,因此连接需要是左连接,但如果搜索匹配,我只希望返回它匹配的记录,而不是右表中的所有其他记录。

这是我的尝试,但失败了,因为它没有连接消息并且返回了与搜索条件不匹配的无关记录:

select t.seq, t.`subject`, n.message from tickets t left join tickets_notes n
on t.seq = n.ticket_seq and (t.`subject` like '%search string%' or n.message like '%search string%')
and t.seq=98795 GROUP BY t.seq;

感谢您提供的任何建议。 (请注意:此查询针对数百万条记录运行,因此效率是一个大问题。)

最佳答案

我认为您想要在票证或注释表中进行搜索,并在其中一个或另一个中找到匹配项时返回匹配项。您可以通过左连接和过滤来做到这一点:

select t.seq, t.`subject`, group_concat(n.message, '|')
from tickets t left join
     tickets_notes n
     on n.ticket_seq = t.seq and
        n.message like '%search string%'
where t.subject like '%search string%' or
      n.ticket_seq is not null
group by t.seq;

我不确定为什么您的查询也在特定 seq 上进行搜索。

编辑:

如果您想要 seq所有注释(其中匹配位于任一位置),则在聚合之后进行过滤:

select t.seq, t.subject,
       group_concat(n.message, '|')
from tickets t left join
     tickets_notes n
     on n.ticket_seq = t.seq
group by t.seq
having sum(n.message like '%search string%') > 0 or
       t.subject like '%search string%';

注意:这些构造假设 t.seq 是唯一/主键 - 正如您的原始查询一样。这就是为什么 t.subjecthaving 中使用而不进行聚合。

关于mysql - 外连接与搜索以及分组依据相结合的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59705546/

相关文章:

php - 本地 php-mysql 安装无法连接到远程数据库?

mysql - 如何在 SELECT 查询中按多列排序?

php - 如何修复此错误 : "Undefined variable: sum"?

sql - 在创建 IDENTITY 的同一个 T-SQL 语句中获取 IDENTITY 值?

php - 将一个表的一列连接到另一个表的多列

Mysql边选择边插入

mysql - 我的 MySQL 服务器上没有绑定(bind)地址变量

django - 如何使用 QuerySet 获取属性 (pk) 的值

asp.net - 使用位从存储过程返回 bool 值

java - neo4j "empty"数据库占用大量磁盘空间