我对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)
也可以,但由于其他原因导致我的问题。我真的需要在一个查询中执行此操作而不会更改太多底层。
有没有人有我错过的超级惊人想法?!
答案 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)
感谢您的评论。我曾尝试过上述的各种形式。我的答案是设置一个新表,将所有现有链接复制到该表中,然后在两个单独的链接表中删除链接后,使用触发器添加/删除该表的链接。这很好用,也允许我在这个新表上使用索引来保持好看和活泼。非常感谢那些花时间发表想法的人!