如何在mysql中检索一对多的关系数据

时间:2017-03-31 04:01:12

标签: mysql

我有两张桌子

表#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中使用吗? 有人可以帮忙吗?

2 个答案:

答案 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表来连接NamesSubjects

<强>姓名

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