2012-07-10 80 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