web-dev-qa-db-ja.com

LEFT JOIN内のmysqlサブクエリ

tbl_emails_sentというセカンダリテーブルの最新のレコードを必要とするクエリがあります。

このテーブルには、クライアントに送信されるすべての電子メールが保持されます。そして、ほとんどのクライアントには数件から数百件のメールが記録されています。最新を表示するクエリを取得したい。

例:

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

サブクエリを使用したLEFT JOINが使用されると思いますが、サブクエリについてはあまり掘り下げていません。私は正しい方向に進んでいますか?

現在、上記のクエリはテーブル内の最新のレコードを指定するために最適化されていないため、少し支援が必要です。

16
coffeemonitor

これは次のようになります。メールが送信された最大日付(または最新日付)を取得するには、別のクエリが必要です。

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

これは機能しませんか?

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

あなたが持っている唯一の問題は、2つの日付が同じ場合、1つが選ばれる決定要因は何ですか?

1
mrmryb