我有两张桌子
表#1
name_id | name
--------|-------
1 | abc
2 | def
表#2
subject_id| name_id |subject
----------|---------|--------
1 | 1 |malayalam
2 | 1 | english
3 | 1 | hindi
4 | 2 | malayalam
5 | 2 | hindi
我想加入这两个表并以下列格式获得输出
id |name |subject1 |subject2 |subject3
---|-----|--------- |---------|--------
1 |abc |malayalam |english |hindi
2 |def |malayalam |hindi |
可以在mySql中使用吗? 有人可以帮忙吗?
答案 0 :(得分:0)
所以我在这里不完全确定您的架构的范围,因为您的subject_id
与每个subject
都没有关联。例如,subject_id 1 = malayalam
但malayalm也等于subject_id 3
,但subject_id 3
也等于hindi
,而hindi
也分配给subject_id 4
。使用非常令人困惑的架构。
你提到它是一对一的,但是在不知道更多背景的情况下我不会看到这种情况。一个人可以有一个以上的主题。一个科目可以属于一个以上的人。这是一个多对多的关系,这意味着你应该在这里使用3个表。
为了您的问题,您可以使用inner join
SELECT one.name_id as id, name, subject
FROM one
INNER JOIN two
ON id = two.name_id
ORDER BY id;
该查询的输出将是:
1 | abc | malayalam
1 | abc | english
1 | abc | hindi
2 | def | malayalam
2 | def | hindi
但是,我会高度考虑重新设计您的数据库。我的意思是你想要那种格式的数据,只有3个主题看起来不错。但是当一个人有50个科目时会发生什么?你还想让所有科目都在这样吗?分解它会更好,当数据库开始变得更加复杂时,它将为您节省时间。在许多情况下,要创建多对多关系,您需要一个连接两个实体的第三个表,在这种情况下,我要创建一个Enrolled_Classes
表来连接Names
和Subjects
<强>姓名强>
name_id | name
--------------
1 | abc
2 | def
<强>受试者强>
subject_id | subject
--------------------
1 | malayalm
2 | english
3 | hindi
<强> Enrolled_Classes 强>
name_id | subject_id
--------------------
1 | 1
1 | 2
1 | 3
2 | 1
2 | 3
然后您需要另一个join
查询:
SELECT name, subject
FROM Names
INNER JOIN Enrolled_Classes
ON Names.name_id = Enrolled_Classes.name_id
INNER JOIN Subjects
ON Enrolled_Classes.subject_id = Subjects.subject_id;
相同输出
abc | malayalam
abc | english
abc | hindi
def | malayalam
def | hindi
答案 1 :(得分:0)
我会留下我的另一个答案,因为我认为您应该考虑重新设计数据库架构。你正在使用MySQL,所以你尝试过使用group_concat()
吗?它不会像这样以表格形式表达,但会给你预期的数据,其中不同的主题将是CSV格式。
SELECT one.name_id as id, name, group_concat(subject)
FROM one
INNER JOIN two
ON id = two.name_id
GROUP BY id;
<强>输出强>
1 | abc | malayalam, english, hindi
2 | def | malayalam, hindi