web-dev-qa-db-fra.com

sous-requête mysql dans une jointure gauche

J'ai une requête qui nécessite l'enregistrement le plus récent d'une table secondaire appelée tbl_emails_sent.

Ce tableau contient tous les e-mails envoyés aux clients. Et la plupart des clients ont enregistré plusieurs à plusieurs centaines de courriels. Je veux extraire une requête qui affiche la plus récente.

Exemple:

SELECT c.name, c.email, e.datesent
FROM `tbl_customers` c
LEFT JOIN `tbl_emails_sent` e ON c.customerid = e.customerid

J'imagine qu'un LEFT JOIN avec une sous-requête serait utilisé, mais je ne me penche pas beaucoup sur les sous-requêtes. Suis-je dans la bonne direction?

Actuellement, la requête ci-dessus n'est pas optimisée pour spécifier l'enregistrement le plus récent dans le tableau, j'ai donc besoin d'un peu d'aide.

16
coffeemonitor

Cela devrait être comme ceci, vous devez avoir une requête séparée pour obtenir la date maximale (ou la dernière date) à laquelle l'e-mail a été envoyé.

SELECT  a.*, b.*
FROM    tbl_customers a
            INNER JOIN tbl_emails_sent b
                ON a.customerid = b.customerid
            INNER JOIN
            (
                SELECT      customerid, MAX(datesent) maxSent
                FROM        tbl_emails_sent
                GROUP BY    customerid
            ) c ON  c.customerid = b.customerid AND
                    c.maxSent = b.datesent
25
John Woo

Cela ne fonctionnerait-il pas?

SELECT t1.datesent,t1.customerid,t2.email,t2.name
FROM
(SELECT max(datesent) AS datesent,customerid
FROM `tbl_emails_sent`
) as t1
INNER JOIN `tbl_customers` as t2
ON t1.customerid=t2.customerid

Le seul problème que vous avez alors est de savoir si si deux datants sont identiques, quel est le facteur décisif dans lequel l'un est choisi?

1
mrmryb