0

我有一个真正的 MySQL 问题,我现在认为没有答案。请帮助我,你是我唯一的希望!

将其简化为基础,我有两个表,“人员”和“活动”。这两个表有可能(长篇故事和大量数据涉及)由两个不同的关系表连接: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)

更多注意事项 - 我还尝试创建一个视图来组合两个关系表的结果,而不是通过此视图加入人员和活动。这也有效,但仍然非常缓慢

改变关系的工作方式以整合到一张桌子上是一个令人头疼的问题

我也尝试过像这样的工会-

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) 

这也有效,但由于其他原因给我带来了问题。我真的需要在一个查询中做到这一点,而不需要改变太多的底层。

有没有人有任何我错过的超级棒的想法??!

4

4 回答 4

0

您可以尝试替换ORIN

left join people on people.peopleid IN (peopleactivity.peopleid, entityactivity.entityid)
于 2012-07-10T21:34:16.177 回答
0

1.)尝试将表的id设置为每个表的主键

2.) 使用内连接而不是左连接。不知道为什么在这里使用左连接,因为您将获得活动表上左连接的其他表的所有结果,并且基本上获得所有记录,无论它们在另一个表中是否具有连接值。我认为这也可能对您有所帮助。你能发布你的表的描述。

于 2012-07-10T21:49:10.233 回答
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 
于 2012-07-10T23:01:02.363 回答
0

感谢您的评论。我已经尝试过上述的各种化身。我的答案是设置一个新表,将所有现有链接复制到该表中,然后在两个单独的链接表中添加删除链接时使用触发器添加/删除该表的链接。这很好用,还允许我在这个新表上使用索引来保持美观和活泼。非常感谢那些花时间发布想法的人!

于 2013-02-27T18:01:46.090 回答