Mysql离开加入太长时间或崩溃...请帮忙

时间:2011-02-24 21:44:41

标签: php mysql sql

大家好,我正在创建一个工作报告,出于某种原因,在使用左连接时遇到了一些严重的问题。我有两个表,一个u_entities表和一个u_activities表,其中存在从实体到活动的一对多关系。我需要找出哪些实体没有与之关联的活动。所以我想将连接实体留给活动并列出空的活动。所以我的查询看起来像这样

              SELECT *
              FROM (SELECT a.activity_id, e.entity_id, e.acc_name
                    FROM u_entity AS e
                    LEFT JOIN u_activity AS a
                    ON e.entity_id = a.account_id) AS i
              WHERE i.activity_id = ''

这只是花了太长时间才看到左连接的结果我试图在phpmyadmin中运行子选择看起来像这样

                    SELECT a.activity_id, e.entity_id, e.acc_name
                    FROM u_entity AS e
                    LEFT JOIN u_activity AS a
                    ON e.entity_id = a.account_id

我遇到了同样的问题,服务器只是继续工作,它永远不会完成。我必须使用xammp来获取表并在我的本地计算机上运行查询,因为人们需要服务器并且它已锁定。当我在本地主机端的phpmyadmin中运行第二个查询时,我的计算机崩溃了。实体表有大约20,000条记录,活动大约80000但我已经在这些表上做了内连接,没有问题我不明白为什么这是一个问题。也许我的查询错了或者其他什么。我以前从未做过左联,所以我不知道。如果有另一种方法可以做到这一点很酷但我真的想知道为什么左连接无法正常工作。如有任何回复将不胜感激。

2 个答案:

答案 0 :(得分:2)

作为注释,获取没有活动的实体的更快捷的方法是


SELECT e.id, ...
FROM u_entity e
LEFT JOIN u_activity a ON e.entity_id=a.account_id
WHERE ISNULL(a.account_id)

关于运行缓慢的问题,您希望确保已在联接中使用的列上创建索引(在本例中为entity_idaccount_id)并且它们已启动到目前为止(运行repair table u_entityrepair table u_activity - 如果你的表是MyISAM)。你真的要运行EXPLAIN SELECT...(在EXPLAIN部分之后放置所有查询)并在此处发布结果以获得更好的帮助。

答案 1 :(得分:1)

听起来你想从u_entities中选择u_activities中没有任何行的所有内容。这样做的方法是使用子查询,而不是任何类型的连接。这是一种方式:

SELECT * FROM u_entities
 WHERE entity_id
       NOT IN (SELECT DISTINCT account_id FROM u_activity)

这是另一个:

SELECT * FROM u_entities
WHERE NOT EXISTS (
    SELECT account_id
      FROM u_activity
     WHERE u_activity.account_id = u_entities.entity_id
     LIMIT 1
    )