Возникли проблемы с использованием left join с group_concat

#mysql #sql

#mysql #sql

Вопрос:

Я новичок в mysql — поэтому приношу извинения за вопросы новичка. Я немного исследовал, но из-за отсутствия общего понимания мой мозг на данный момент похож на крендель.

Что я хочу сделать, так это вывести список заявок — этот вывод содержит несколько полей, включая поле для блокировки заявок. Следующий SQL даст мне, более или менее, то, что я хочу:

 select j3.pkey, j3.summary, blockers.blocking_tickets, j3.reporter, j3.assignee,     j3.created, j3.resolutiondate

from 
    (select j2.id, group_concat(j1.pkey) blocking_tickets
    from jiraissue j1, issuelink, issuelinktype, jiraissue j2 
    where j1.id=issuelink.SOURCE 
    and j2.id=issuelink.DESTINATION 
    and issuelinktype.id=issuelink.linktype
    and  issuelinktype.INWARD = 'is blocked by'
    group by j2.pkey) blockers, jiraissue j3

where 
blockers.id = j3.id
AND
((DATE_SUB(CURDATE(),INTERVAL 24 Hour) <= j3.resolutiondate) or (DATE_SUB(CURDATE(),INTERVAL 24 Hour) <= j3.created))
  

— Я понимаю, что мне здесь не нужен подзапрос — это был всего лишь первый шаг.. в любом случае, проблема в том, что мой запрос не показывает мне все заявки (я хочу, чтобы в моем выводе были возвращены все записи для заявок, независимо от того, есть ли у них блокирующие заявки в поле блокирующий запрос).

Итак, я решил, что мне нужно какое-то левое соединение. Вот тут я совершенно запутался.

Я пробовал это, но я получаю: Неизвестный столбец ‘blockers.id ‘ в предложении ‘on’

 select j3.pkey, j3.summary, blockers.blocking_tickets, j3.reporter, j3.assignee, j3.created, j3.resolutiondate

from 
(select j2.id, group_concat(j1.pkey) blocking_tickets
    from jiraissue j1, issuelink, issuelinktype, jiraissue j2 
    where j1.id=issuelink.SOURCE 
    and j2.id=issuelink.DESTINATION 
    and issuelinktype.id=issuelink.linktype
    and  issuelinktype.INWARD = 'is blocked by'
    group by j2.pkey) blockers, jiraissue j3

left join jiraissue on blockers.id = jiraissue.id

where ((DATE_SUB(CURDATE(),INTERVAL 24 Hour) <= j3.resolutiondate) or (DATE_SUB(CURDATE(),INTERVAL 24 Hour) <= j3.created));
  

Любые советы приветствуются. Я признаю, что, вероятно, делаю какие-то довольно нелепые вещи — поэтому, пожалуйста, будьте нежны ! 🙂

Спасибо.

Ответ №1:

Похоже, что есть некоторые остатки от предыдущего запроса. Вероятно, должно быть

     group by j2.pkey) blockers

left join jiraissue j3 on blockers.id = j3.id
  

Комментарии:

1. Хорошо — этот sql будет выполнен, но по-прежнему показывает только результаты из j3, где они совпадают с блокировщиками. Чего мне здесь не хватает? Я хочу получить все результаты j3, включая то, где они совпадают.

2. Может быть, правое соединение? Нелегко сказать без таблиц.

Ответ №2:

Я думаю, ваша проблема в том, что ваш вложенный запрос не выдает имя столбца id , оно просто есть j2.id , и MySQL не удаляет j2 префикс. Попробуйте изменить

 select js.id, group_concat /*...*/
  

Для

 select j2.id as id, group_concat /*...*/
  

Ответ №3:

Мне этот бит кажется неуместным:

 group by j2.pkey) blockers, jiraissue j3
  

Почему бы просто не:

 group by j2.pkey) blockers
  

?