Проблема с внешним соединением в сочетании с поиском в сочетании с группой - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь сделать 2 вещи с помощью запроса.

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 Ответ

1 голос
/ 12 января 2020

Я думаю, что вы хотите выполнить поиск в таблице билетов или заметок и вернуть совпадение, когда найдете совпадение в одном или другом. Вы можете сделать это с помощью 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, где совпадение в любом месте, тогда выполните фильтрацию после агрегации:

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 без агрегирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...