嗨我有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)
AND USED选择LIKE
SELECT p1.name, p2.name, p3.name....
但是如果我有很多行LIKE 10000,那么这个查询会慢慢来。
如何更改它以使用1 JOIN?
答案 0 :(得分: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 :(得分:1)
你不能在一个JOIN中完成所有这些,你的选择可能是审查数据库设计,因为1000加入不正常......
我最好的建议是创建一个关系表,所以你会有类似
的东西即:
table_person 1是table_person_2的朋友
你不需要1000加入才能知道谁是谁的朋友......你只需要一个具有正确表结构和索引的连接。
请查看E/R Modeling
修改强>
我的建议是没有一个包含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