2011-02-24 73 views
0

大家好我在創建工作報告,出於某種原因在使用左連接時遇到了一些嚴重問題。我有兩個表,一個u_entities表和一個u_activities表,其中存在從實體到活動的一對多關係。我需要找出哪些實體沒有與之關聯的活動。所以我想讓連接實體離開活動並列出空的活動。所以我的查詢看起來像這樣Mysql左連接花費太長時間或崩潰...請幫助

   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在我的本地機器上運行查詢,因爲人們需要服務器並鎖定了它。當我在localhost端運行phpmyadmin中的第二個查詢時,我的電腦崩潰了。實體表有大約20000條記錄和大約80000的活躍度,但我在這些表上完成了內部連接,沒有問題,我不明白爲什麼這是一個問題。也許我的查詢是錯誤的或什麼的。我從來沒有做過左的加入,所以我不知道。如果有另一種方法可以做到這一點,但我很想知道爲什麼左連接無法正常工作。請任何迴應將不勝感激。

+2

您可以張貼在這兩個查詢的解釋(或者至少內層查詢)? – Damp 2011-02-24 21:46:41

+0

至少在e.entity_id上應該有一個索引,a.account_id,i.activity_id – 2011-02-24 21:51:14

+0

我同意@Dagon。這些表如何索引? – 2011-02-24 21:56:01

回答

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部分之後),並在這裏發佈結果以獲得更好的幫助。

+0

嘿你的查詢工作在1.4171秒,所以我沒有打擾做解釋,但它花了五分鐘以上加載在phpmyadmin。爲什麼會發生? – Dom 2011-02-25 15:46:52

+0

,因爲您的版本首先運行子查詢,獲取所有實體,加入活動,將所有數據存儲在臨時表中,然後通過臨時表(未索引)查找所有沒有activity_id的項目,而在我的版本中,只通過實體表格篩選出沒有關聯活動的元素。 – matei 2011-02-26 15:21:24

1

聽起來好像要從u_activities中不存在任何行的u_entities中選擇所有內容。這樣做的方式是使用子查詢,而不是任何類型的聯接。這裏有一種方法:

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 
    ) 
+0

謝謝你們所有的問題都很好。特德的第二個查詢是1.29秒內最快的。 – Dom 2011-02-25 16:09:46

+0

爲什麼我不接受兩個答案? – Dom 2011-02-25 16:10:27

+0

衆議院規則。你必須取消接受另一個。 :) – 2011-02-25 17:07:13

相關問題