Имам две таблици 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