我正在尝试通过查询执行两件事。
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;
感谢您提供的任何建议。 (请注意:此查询是针对数百万条记录运行的,因此效率是一个大问题。)
答案 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.subject
在having
中使用而没有聚合的原因。