【发布时间】:2018-04-23 06:43:03
【问题描述】:
我有两张桌子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);
我需要获取客户的公司名称和每个公司名称的最后添加的电话号码。 是否有任何优化的方式或不使用子查询的方式来实现这一目标?
已解决
非相关子查询的性能总是优于相关子查询。
【问题讨论】:
-
你能explain你的查询吗?
-
我需要获取客户公司名称和他们的电话号码。每个客户只有一个电话号码,应该是最后添加的一个。
-
Bill Karwin 的回答可能会对您有所帮助
Retrieving the last record in each group -
@Rajez 不,我的意思是使用解释语法,表可能没有优化,应该有一个索引
标签: mysql query-optimization groupwise-maximum