0

こんにちは、mysql に問題があります。私は2つのテーブルを持っています。

テーブルワークとテーブルパーソン。

テーブルワークには、ID person Likeの4つの列があります

person1, person2, person3, person4, person5
  5          3       111      15       8

それはそれでなければなりません。

今、私はテーブルワークで名前が人の行を選択したいと考えています。まず、これを使用しました:

JOIN person p1 ON(w.person1 = p1.id)
JOIN person p2 ON(w.person1 = p1.id)
JOIN person p3 ON(w.person1 = p1.id)
JOIN person p4 ON(w.person1 = p1.id)
JOIN person p5 ON(w.person1 = p1.id)

AND USED いいねを選択

SELECT p1.name, p2.name, p3.name.... 

しかし、10000 のような多くの行がある場合、このクエリはゆっくりになります。

1 JOIN を使用するように変更するにはどうすればよいですか?

4

2 に答える 2

3

テーブルpersonは正規化されていないため、データを取得するには、見つけたように複数回結合するか、UNION ALLクエリを使用してデータのピボットを解除する必要があります。

このタイプのクエリは次のようになります。

select *
from work w
inner join
(
  select person1 p_name
  from person
  union all
  select person2
  from person
  union all
  select person3
  from person
  union all
  select person4
  from person
  union all
  select person5
  from person
) p
  on w.person1 = p.p_name

データのピボットを解除すると、列を取得して行に変換し、データに対して1つの結合を実行できるようになります。

于 2013-01-25T16:19:40.800 に答える
1

1回のJOINですべてを行うことはできません.1000回の結合は通常ではないため、オプションはDB設計を確認することです...

私の最善のアドバイスは、関係テーブルを作成することです。そのため、次のようなものになります

いいえ:

table_person_1 は table_person_2 の友達です

誰が誰の友達かを知るために1000回の参加は必要ありません...適切なテーブル構造とインデックスを使用して、参加するだけです。

E/Rモデリングをご覧ください

編集

私のアドバイスは、5 つの列 (person1、person2、person3...) を持つ 1 つのテーブルを持たず、person1 と person2 で追加のテーブルを作成し、そこにそれらの間のすべての関係を追加することです。

今あなたが持っている

person1, person2, person3, person4, person5
  5          3       111      15       8

これをテーブルに置くことをお勧めします。

person1, person2
  5          3  
  5         111  
 5          15  
 5           8  
于 2013-01-25T15:01:37.473 に答える