2012-07-10 113 views
0

我有一個MySQL問題的真正mindbender,我現在認爲沒有答案。請幫助我,你是我唯一的希望!MySQL查詢加入2個表和2個關係表

剝離到基礎,我有兩個表,「人」和「活動」。這兩個表格可能會涉及到兩個不同的關係表:people_activity和entity_activity 我需要對活動表執行一個查詢,以便將人員記錄鏈接到活動記錄基於兩個關係表。

這是我有,但它是對大量數據的大規模慢:

select * from activity 
left join peopleactivity on peopleactivity.activityid = activity.activityid 
left join entityactivity on entityactivity.activityid = activity.activityid 
left join people on (peopleactivity.peopleid = people.peopleid OR 
        entityactivity.entityid = people.peopleid) 

一些更多的注意事項 - 我也試圖創建一個視圖兩個關係表的結果結合起來,而不是加盟人們和活動通過這個觀點。這也適用,但也仍然大量慢

更改關係/ s的工作如何consolodate一個表是一個大難題

我也嘗試了工會樣這一點 -

select * from activity 
left join peopleactivity on peopleactivity.activityid = activity.activityid 
left join people on (peopleactivity.peopleid = people.peopleid) 
union 
select * from activity 
left join peopleactivity on peopleactivity.activityid = activity.activityid 
left join people on (entityactivity.entityid= people.peopleid) 

這也適用,但由於其他原因導致我的問題。我真的需要在一個查詢中做到這一點,而不會改變太多的底層。

有沒有人有任何超級驚人的想法,我已經錯過了??!

+0

在第二個查詢(UNION)中,它看起來像是UNIONing兩個相同的查詢。我認爲其中的一個應該涉及'entityactivity'表,而不是'peopleactivity'表。另外,'UNION ALL'運算符可以比'UNION'運算符有更多的性能優勢。 – spencer7593 2012-07-10 21:27:07

+0

每個單獨查詢的性能如何?每個人「大幅減速」還是他們分別「非常快」?對每個查詢進行EXPLAIN,並在組合查詢上回答諸如正在使用哪些索引等問題。有時需要兩個單獨的查詢才行。 – spencer7593 2012-07-10 21:29:59

回答

0

感謝您的意見。我曾嘗試過以上各種化身。我的答案是設置一個新表,將所有現有鏈接複製到該表中,然後使用觸發器添加/刪除指向該表的鏈接,只要在兩個單獨的鏈接表中刪除鏈接即可。這很好,也允許我在這張新桌子上使用索引來保持事物的美好和活潑。非常感謝那些花時間發佈想法的人!

0

您可以嘗試與IN

left join people on people.peopleid IN (peopleactivity.peopleid, entityactivity.entityid) 
0

1)嘗試設置表的ID爲每個表的主鍵來代替OR

2)使用內部連接,而不是左聯接。不知道爲什麼你在這裏使用左連接,因爲你將得到在活動表上剩下的其他表的所有結果,並且基本上獲得所有記錄,而不管它們是否在另一個表中具有連接值。我認爲這也可以幫助你。你可以發表你的表格的描述嗎?

0

我認爲你應該保持UNION查詢,但使這些INNER連接。你真的需要LEFT連接嗎?

你也可以把它變成UNION ALL,這將有一定的性能增益:

SELECT activity.*, people.*, 'PA' AS joining_table 
    FROM activity 
    JOIN peopleactivity ON peopleactivity.activityid = activity.activityid 
    JOIN people ON peopleactivity.peopleid = people.peopleid 
UNION ALL 
SELECT activity.*, people.*, 'EA' 
    FROM activity 
    JOIN entityactivity ON entityactivity.activityid = activity.activityid 
    JOIN people ON entityactivity.entityid = people.peopleid