mysql - 优化 MySQL 查询删除子查询

标签 mysql sql

有这些表:

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/

相关文章:

php - 与 MySQL 数据库链接的 html 搜索表单

php - 尝试插入 mysql 数据库忽略空白字段

php - 更新记录时出错

php - 本地主机不工作,但网站在 Android 中工作

mysql - SQL group by,如何定义每个组的记录,例如。最新的,已使用

mysql - 使用 STR_TO_DATE() 获取第一天

java - JDBC:UserID作为主键,在Java代码中增加

sql - 在 microsoft sql server 2008 中运行查询之前如何知道有多少行将受到影响

sql交叉连接查询

mysql - SQL:达到 unix 时间时如何删除一行?