0

私は2つのテーブルcustomersとそのcontacts. 顧客は多くの連絡先詳細を持つことができます。場合によっては、最後に追加された顧客の連絡先の詳細のみを取得する必要があります。これは で取得できますsubquery。しかし、データが膨大な場合、すべての顧客データをクエリする際のパフォーマンス不足に直面しています。

顧客テーブル (customers_customers)

+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          |
+-------------------+--------------+------+-----+---------+----------------+
| id                | int(11)      | NO   | PRI | NULL    | auto_increment |
| company_name      | varchar(150) | NO   |     | NULL    |                |
| logo              | varchar(100) | NO   |     | NULL    |                |
+-------------------+--------------+------+-----+---------+----------------+

連絡先テーブル (customers_customercontacts)

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| email       | varchar(100) | YES  |     | NULL    |                |
| mobile      | varchar(50)  | YES  |     | NULL    |                |
| customer_id | int(11)      | NO   | MUL | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

次のクエリを試してみましたが、結果は得られますが、クエリが遅いです。

SELECT
    c.id,
    c.company_name,
    d.mobile
FROM customers_customers AS c
LEFT JOIN customers_customercontacts AS d
    ON d.id = (SELECT MAX(id) FROM customers_customercontacts WHERE d.customer_id = d.id);

SELECT
    c.id,
    c.company_name,
    d.mobile
FROM customers_customers AS c
LEFT JOIN customers_customercontacts AS d
    ON d.id = (SELECT id FROM customers_customercontacts WHERE d.customer_id = d.id
               ORDER BY id DESC LIMIT 1);

顧客の company_names と、各 company_names の最後に追加された phone_number を取得する必要があります。これを達成するために、最適化された方法またはサブクエリを使用しない方法はありますか?

解決済み

非相関サブクエリは、常に相関サブクエリよりも優れたパフォーマンスを発揮します。

4

1 に答える 1