我正在尝试通过查询做两件事。
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.subject
在 having
中使用而不进行聚合。
关于mysql - 外连接与搜索以及分组依据相结合的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59705546/