У меня есть две таблицы 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);
Мне нужно получить имя компании клиента и последний добавленный номер телефона каждого имени компании. Есть ли какой-либо оптимизированный способ или способ без использования подзапроса для достижения этого?
Решено
Некоррелированные подзапросы всегда обеспечивают более высокую производительность, чем коррелированные подзапросы.
Retrieving the last record in each group
- person M Khalid Junaid   schedule 10.11.2017