MySQL Query加入2个表,包含2个关系表

时间:2012-07-10 21:21:41

标签: mysql

我对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 个答案:

答案 0 :(得分:0)

您可以尝试将OR替换为IN

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

答案 1 :(得分:0)

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

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

答案 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 

答案 3 :(得分:0)

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