Sql-запрос внутри внутреннего соединения

у меня есть это заявление mysql :

SELECT ca.*, MAX(ca.id), v.*,a.submit_dt from callback_holding ca 
inner join valuations v on v.Ref = ca.ref
inner join answer a on a.title = ca.ref
where v.Consultant = '$user' and ca.isholding = 2 
GROUP BY ca.ref DESC order by ca.reccomendeddate asc

Но проблема в том, что если нет записи в «answer», то она не отображается в списке. Как правильно вернуть все и просто «null», если в таблице» ответ » ничего нет?

Спасибо

2 ответа

  1. Ваш запрос имеет несколько проблем. Во-первых, вы группируетесь по refстолбцу из callback_holdingтаблицы, но выбираете неагрегатные столбцы не только из этой таблицы, но и из других таблиц. Чтобы обойти это, необходимо выполнить агрегацию, чтобы найти максимальные идентификаторы callback_holdingв подзапросе, а затем присоединить его к другим таблицам.

    Далее, вы упомянули, что если не будет найден ответ, вы не получите никаких записей. Это характер an INNER JOIN, но если вы переключите соединение answerна использование aLEFT JOIN, то никакие записи до этого момента в запросе не будут потеряны. Обратите внимание, что я использовал COALESCE(a.submit_dt, 'NA')для отображения NAв случае, если этот столбец из таблицы ответовNULL. Если этот столбецdatetime, то вы должны использовать подходящее значение по умолчанию, например NOW().

    SELECT ca.*,
           v.*,
           COALESCE(a.submit_dt, 'NA') AS submit_dt,   -- display 'NA' if no answer
           t.max_id
    FROM callback_holding ca
    INNER JOIN
    (
        SELECT ref, MAX(id) AS max_id
        FROM callback_holding
        GROUP BY ref
    ) t
        ON t.ref = ca.ref AND
           t.max_id = ca.id
    INNER JOIN valuations v
        ON v.Ref = ca.ref
    LEFT JOIN answer a
        ON a.title = ca.ref
    WHERE v.Consultant = '$user' AND
          ca.isholding = 2
    ORDER BY ca.reccomendeddate
    
  2. попробуйте с:

    SELECT ca.*, MAX(ca.id), v.*,a.submit_dt from callback_holding ca 
    INNER join valuations v on v.Ref = ca.ref
    LEFT join answer a on a.title = ca.ref
    WHERE v.Consultant = '$user' and ca.isholding = 2 
    GROUP BY ca.ref DESC order by ca.reccomendeddate asc