0

私は今、答えがないと考えているMySQLの問題の真のマインドベンダーを持っています. 私を助けてください、あなたは私の唯一の希望です!

基本に落とし込むと、「People」と「Activity」という 2 つのテーブルがあります。これらの 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)

いくつかの注意事項 - 2 つの関係テーブルの結果を結合するビューを作成し、代わりにこのビューを介して人とアクティビティを結合しようとしました。これも機能しますが、それでも非常に遅いです

1 つのテーブルに統合するためにリレーションシップがどのように機能するかを変更することは、大きな頭痛の種です

私はユニオンも試しました-このように-

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) 

これも機能しますが、他の理由で問題が発生します。基になるものをあまり変更せずに、1 つのクエリでこれを行う必要があります。

私が見逃した素晴らしいアイデアを持っている人はいますか??!

4

4 に答える 4

0

あなたはで置き換えようとするかもしれませORIN

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

コメントありがとうございます。私は上記のさまざまな化身を試しました。私の答えは、新しいテーブルをセットアップし、既存のすべてのリンクをそのテーブルにコピーしてから、トリガーを使用して、リンクが追加されたときにそのテーブルへのリンクを追加/削除することでした。これはうまく機能し、この新しいテーブルでインデックスを使用して、物事をうまくスムーズに保つこともできます。アイデアを投稿するのに時間を割いてくれた人たちに感謝します!

于 2013-02-27T18:01:46.090 に答える
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 に答える