J'ai cette déclaration 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

Mais le problème est que s'il n'y a pas d'entrée dans «réponse», cela n'apparaît pas dans la liste. Quelle est la bonne façon de ramener tout et juste "null" s'il n'y a rien dans la table "réponse"?

Merci

0
Gaz Smith 17 janv. 2017 à 17:30

2 réponses

Meilleure réponse

Votre requête présente plusieurs problèmes. Tout d'abord, vous groupez par la colonne ref de la table callback_holding, mais vous sélectionnez des colonnes non agrégées non seulement à partir de cette table, mais également à partir d'autres tables. Pour contourner ce problème, vous devez effectuer l'agrégation pour trouver le maximum d'ID dans callback_holding dans une sous-requête, puis la joindre aux autres tables.

Ensuite, vous avez mentionné que si aucune réponse n'est trouvée, vous ne récupérez aucun enregistrement. C'est la nature d'un INNER JOIN, mais si vous basculez la jointure sur answer pour utiliser un LEFT JOIN, aucun enregistrement jusqu'à ce point dans la requête ne sera perdu. Notez que j'ai utilisé COALESCE(a.submit_dt, 'NA') pour afficher NA dans le cas où cette colonne de la table de réponse serait NULL. Si cette colonne est datetime, vous devez utiliser une valeur par défaut appropriée, par exemple 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
0
Tim Biegeleisen 17 janv. 2017 à 15:00

Essayez avec:

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
0
carmine 17 janv. 2017 à 14:36