MYSQL无法生成临时表(海量查询)
我有4张桌子(1到多张): 不要说任何关于“电子邮件”关系的话。这就是我的开发人员老板多年前构建它的方式 因此,我需要根据客户指定的员工和他们的兴趣筛选客户。 以下是查询:MYSQL无法生成临时表(海量查询),mysql,sql,Mysql,Sql,我有4张桌子(1到多张): 不要说任何关于“电子邮件”关系的话。这就是我的开发人员老板多年前构建它的方式 因此,我需要根据客户指定的员工和他们的兴趣筛选客户。 以下是查询: SELECT * FROM ( SELECT customers.id AS 'id', customers.name AS 'first_name',
SELECT
*
FROM
(
SELECT
customers.id AS 'id',
customers.name AS 'first_name',
customers.email,
employees.id AS 'employee_id'
FROM
customers,
employees
WHERE
employees.id = 2
AND
customers.employee_assigned = employees.id
) AS myCustomers
LEFT JOIN interests_categories
ON interests_categories.customer_email = myCustomers.email
LEFT JOIN interests_products
ON interests_categories.customer_email = myCustomers.email
WHERE
(
interests_categories.category_id = 20
OR
interests_categories.category_id = 21
)
GROUP BY myCustomers.email
所以,问题是:
- 如果员工分配的客户数量较少(如3),则查询 他成功了
- 如果该员工的指定客户数为中高(超过100个),则查询问题。
谢谢。检查表上的索引并尝试以下操作:
SELECT
c.id AS 'id',
c.name AS 'first_name',
c.email,
e.id AS 'employee_id'
ic.*,
ip.*
FROM customers c
JOIN employees e
ON c.employee_assigned = e.id
LEFT JOIN interests_categories ic
ON ic.customer_email = c.email
LEFT JOIN interests_products ip
ON ic.customer_email = c.email
WHERE
(
ic.category_id IN (20,21)
AND e.id = 2
)
GROUP BY myCustomers.email
顺便说一句,一个不那么愚蠢的设计可能如下所示。如果是我,我会从这个开始,并相应地提供具有适当代表性的CREATE和INSERT语句。此外,我很好奇category_id来自何处,因为这可能是进一步优化的一个领域
EMPLOYEES
------------------------------------------------
employee_id name
6 EmpName 1
12 EmpName 2
CUSTOMERS
------------------------------------------------
customer_id name email employee_assigned
1 John john@doe.com 12
2 Donald donald@duck.com 6
INTERESTS_CATEGORIES
------------------------------------------------
customer_id category_id
1 97
1 13
2 56
2 126
2 45
INTERESTS_PRODUCTS
------------------------------------------------
customer_id product_id
1 78
1 23
2 19
2 56
2 45
摆脱子查询,只使用联接。此外,使用in而不是where子句中的OR。最后,确保每个表中的电子邮件列以及where或on子句中使用的任何列都有索引。我会尝试。谢谢您的回答。:)最多,在没有聚合函数的查询中包含GROUPBY子句是有误导性的。好吧,我对sql有些了解,但我不是大师。我的工作是php和jquery插件开发,但现在我一个人在这里,没有SQL Master支持。因此,我发现一个超大型查询不起作用。(sry代表我的英语)@Sloan,在emails字段中添加索引是可行的,但可以实现我的旧查询,而不是你的查询。我会努力让你的工作,因为我的不会显示我想要的结果。@Sloarchasher没有,但结果为0。我告诉过你,这个问题比我在这篇文章中提到的要大。我不再尝试使用你的方式了,因为你的方式比我的更符合逻辑。少一些愚蠢的设计?这意味着什么?我是stackoverflow的新手。类别id来自名称关联表。category_id 1意味着,例如,计算机、category 2儿童玩具等。好吧,这会删除“电子邮件关系”,不是吗?所以,别那么傻了。我不能这么做。我说这是一个古老的大型数据库。新客户每1小时同步一次,但之前会在一个繁琐的过程中插入兴趣,因此当插入兴趣时,您只知道电子邮件,而不知道ID。我必须使用我拥有的。我无法进行重大更改,因为这可能会导致重大错误和浪费时间。下次我将提供创建和插入查询。这是我第一篇关于SQL的文章,我不知道这一点。谢谢你的帮助!
EMPLOYEES
------------------------------------------------
employee_id name
6 EmpName 1
12 EmpName 2
CUSTOMERS
------------------------------------------------
customer_id name email employee_assigned
1 John john@doe.com 12
2 Donald donald@duck.com 6
INTERESTS_CATEGORIES
------------------------------------------------
customer_id category_id
1 97
1 13
2 56
2 126
2 45
INTERESTS_PRODUCTS
------------------------------------------------
customer_id product_id
1 78
1 23
2 19
2 56
2 45