0

嗨,我有 mysql 的问题。我有 2 张桌子。

餐桌工作和餐桌人。

在表格工作中,我有 4 列 ID 人喜欢

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

一定是这样。

现在我想选择任何带有表格工作但名称为 person 的行。首先我用这个:

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)

并使用选择喜欢

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

通过取消透视数据,您可以获取列并将其转换为行,以便您可以对数据执行一次连接。

于 2013-01-25T16:19:40.800 回答
1

您不能在一次 JOIN 中完成所有操作,您可以选择查看数据库设计,因为 1000 次连接是不正常的......

我最好的建议是创建一个关系表,所以你会有类似的东西

IE:

table_person 1 是 table_person_2 的朋友

您不需要 1000 次加入就可以知道谁是谁的朋友……您只需要一个加入,具有正确的表结构和索引。

请查看E/R 建模

编辑

我的建议是不要有一个包含 5 列的表(person1、person2、person3...),用 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 回答