2012-04-26 62 views
0

this article的启发我尝试了从我们的数据库优化成员列表的导出功能。加入多个表格?

原来的查询是这样的:

-- First query 
SELECT 
    * 
FROM 
    members_customer_id_0000000169 
WHERE 
    deleted = '0000-00-00 00:00:00' 

-- Second query run for every result from first query 
SELECT 
    stores.external_store_id AS local_store_id 
FROM 
    regions, 
    stores, 
    stores_reference_members_customer_id_0000000169 
WHERE 
    regions.customer_id = 169 
AND 
    stores.region_id = regions.id 
AND 
    stores_reference_members_customer_id_0000000169.member_id =' . $result['id'] . ' 
AND 
    stores_reference_members_customer_id_0000000169.store_id = stores.id 

第一个查询返回180K行,它的性能是没有效率的第二个查询获取所有180K倍。

我想不是这样做:

SELECT 
    members_customer_id_0000000169.*, 
    stores.external_store_id AS local_store_id 
FROM 
    members_customer_id_0000000169 
LEFT JOIN 
    stores_reference_members_customer_id_0000000169 
ON 
    stores_reference_members_customer_id_0000000169.member_id = members_customer_id_0000000169.id 
JOIN 
    regions 
JOIN 
    stores 
WHERE 
    members_customer_id_0000000169.deleted = '0000-00-00 00:00:00' 
AND 
    regions.customer_id = 169 
AND 
    stores.region_id = regions.id 
AND 
    stores_reference_members_customer_id_0000000169.store_id = stores.id 

结果是只有140K行。原因可能是我没有按照我的意愿得到没有local_store_id的会员。 而我不确定问题是什么。

由于许多表和WHERE子句,我相信我在连接方面做了错误,但我只有在两个表之间进行左/右连接的经验。

任何人都可以找出问题吗?

回答

1

每个JOIN操作应该有一个相应的ON语句来告诉SQL如何合并新表中的记录。看起来你正在做WHERE语句中的一些逻辑,这可能会导致问题。

此外,至于获取没有local_store_id的成员,可能是因为您正在对商店进行内部连接,所以您的结果集只有根据连接逻辑在商店中具有相应行的成员。左外连接可能会给你你想要的。

+0

将'LEFT JOIN'改为'LEFT OUTER JOIN'给了我相同的结果。您似乎不可能将WHERE子句移到连接处 - 或者至少,我不知道应该如何完成这个任务。 – Repox 2012-04-26 11:59:41

+0

那么,最终让WHERE子句移动到连接,而是给了我需要的结果。谢谢。 – Repox 2012-04-26 12:59:45