有这些表:
customers
---------------------
`id` smallint(5) unsigned NOT NULL auto_increment,
`name` varchar(100) collate utf8_unicode_ci default NOT NULL,
....
customers_subaccounts
-------------------------
`companies_id` mediumint(8) unsigned NOT NULL,
`customers_id` mediumint(8) unsigned NOT NULL,
`subaccount` int(10) unsigned NOT NULL
我需要获取为同一家公司分配了多个子账户的所有客户。
这是我得到的:
SELECT * FROM customers
WHERE id IN
(SELECT customers_id
FROM customers_subaccounts
GROUP BY customers_id, companies_id
HAVING COUNT(subaccount) > 1)
虽然这个查询太慢了。如果我将 DISTINCT 修饰符添加到子查询的 SELECT 中的 customers_id,它会更慢,最终会为整个查询检索相同的客户列表。也许没有子查询有更好的方法,任何更快的方法都会有所帮助,我不确定它是否会检索到准确的正确列表。
有什么帮助吗?
最佳答案
您可以用 INNER JOIN
替换子查询:
SELECT t1.id
FROM customers t1
INNER JOIN
(
SELECT DISTINCT customers_id
FROM customers_subaccounts
GROUP BY customers_id, companies_id
HAVING COUNT(*) > 1
) t2
ON t1.id = t2.customers_id
关于mysql - 优化 MySQL 查询删除子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37787171/