外部联接麻烦,搜索困难,分组依据麻烦

时间:2020-01-12 15:56:15

标签: 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;

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

1 个答案:

答案 0 :(得分:1)

我认为您想在票证或注释表中进行搜索,并在找到一个或另一个匹配项时返回一个匹配项。您可以使用left join并进行过滤:

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 all 条注释中的任何一个都匹配,则在聚合之后进行过滤

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中使用而没有聚合的原因。