2017-10-11 18 views
-1

J'ai une table des enregistrements de l'historique et joint une table de commentaires. Les deux ont des dates - donc un enregistrement de l'historique est fait, et il y a une table de commentaires qui enregistre les commentaires sur cet enregistrement historique. Lorsque j'interroge les tables, je veux tous les enregistrements de l'historique et le commentaire le plus récent pour chacun. Malheureusement, je ne semble pas récupérer les données comme je le souhaite, car si un commentaire est ajouté à un enregistrement historique antérieur, alors cette requête renvoie l'enregistrement d'historique le plus récent (correct) mais le commentaire le plus récent globalement (incorrect) au lieu du commentaire le plus récent pour le dossier d'histoire que je regarde.Lors de la sélection d'un enregistrement à partir d'une table jointe obtenir l'enregistrement le plus récent de la table B (jointe) pour chaque enregistrement de table A si possible

Voici notre MySQL

SELECT h.id 
    , c.id comment_id 
    , c.comment recent_comment 
    , h.* 
    FROM crm_device_history h 
    LEFT 
    JOIN crm_device_history_comments c 
    ON c.crm_device_history_id = h.id 
    AND c.id = (SELECT max(id) 
        FROM crm_device_history_comments 
       WHERE c.crm_device_history_id = h.id) 
WHERE device_id = 147 
    AND crm_history_states_id >= 0 
ORDER 
    BY h.id DESC 

Table crm_device_history

id 
device_id 
crm_history_states_id 
userID 
dateTime 
system_comment 
comment -> this field is to be dropped now we have a separate table 
distributor_assignment 
client_assignment 
updated_date 
created_date 

crm_device_history_comments

id 
crm_device_history_id 
comment 
user_id 
updated_date 
+0

quels sont vos résultats attendus? –

+1

Ajoutez le schéma, les exemples de données, le résultat actuel et attendu dans votre question. Ce sera vraiment utile. –

+0

donc je m'attends à voir l'enregistrement historique le plus récent (h.id) et dans cette rangée le commentaire le plus récent (recent_comment). Ce que je reçois en réalité est l'enregistrement historique le plus récent mais aussi le commentaire le plus récent (donc le commentaire le plus récent dans le tableau des commentaires, pas le plus récent qui s'applique à l'historique que je regarde) – Rich

Répondre

-1

Essayez cette

SELECT h.id, 
     c.id  AS comment_id, 
     c.comment AS recent_comment, 
     h.* 
FROM crm_device_history h 
     LEFT JOIN (SELECT Max([date]), 
         id 
        FROM crm_device_history_comments 
        GROUP BY id) c 
       ON c.crm_device_history_id = h.id 
WHERE device_id = 147 
     AND crm_history_states_id >= 0 
ORDER BY h.id DESC 
+0

Bienvenue sur Stack Overflow! Merci pour cet extrait de code, qui pourrait fournir une aide limitée et immédiate. Une explication appropriée [améliorerait considérablement] (// meta.stackexchange.com/q/114762) sa valeur à long terme en montrant * pourquoi * ceci est une bonne solution au problème, et le rendrait plus utile aux futurs lecteurs avec d'autres questions similaires. S'il vous plaît [modifier] votre réponse pour ajouter quelques explications, y compris les hypothèses que vous avez faites. –

+0

ok cet extrait de code renvoie une colonne inconnue c.comment dans la liste des champs .. – Rich

0

essayez celui-ci

SELECT 
     h.id, 
     sub_query.id AS comment_id, 
     c.comment as recent_comment, 
     h.* 
    FROM 
     crm_device_history h 
    INNER JOIN 
     (SELECT 
      max(id) as id, 
      crm_device_history_id 
     FROM 
      crm_device_history_comments 
     GROUP BY 
      crm_device_history_id) 
     AS sub_query ON sub_query.crm_device_history_id = h.id 
    INNER JOIN 
     crm_device_history_comments AS c ON c.id = sub_query.id 
    WHERE device_id = 147 AND h.crm_history_states_id >= 0 
    ORDER BY h.id DESC 
+0

presque - le commentaire que je reçois pour l'enregistrement de l'historique est l'identifiant de commentaire le plus récent par rapport à l'historique mais le recent_comment provient toujours d'un enregistrement différent. – Rich

+0

J'ai des erreurs, j'ai mis une virgule après recent_comment dans le select et maintenant j'obtiens une 'colonne inconnue crm_device_history_id dans la clause ON' – Rich

+0

pas tout à fait - # 1054 - Colonne inconnue 'crm_device_history.id' dans 'on clause'. Si j'échange cela pour h.id j'obtiens des disques, mais seulement quatre, et pas le commentaire récent pour l'enregistrement d'histoire. Ceci est une tête Bender! – Rich