首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在mysql中获取两个表的列之间的匹配次数

如何在mysql中获取两个表的列之间的匹配次数
EN

Stack Overflow用户
提问于 2012-10-14 02:14:52
回答 4查看 1.2K关注 0票数 1

我正在尝试弄清楚如何在mySQL中使用这个场景-

有三个表-表的t_student, t_teacher, t_result结构(基本上每个表中的列)如下:

代码语言:javascript
复制
t_student:
s_id, s_name, s1, s2, s3

其中s_id是主键,s_name是学生姓名,(s1,s2,s3)是数学、物理、化学等科目。

代码语言:javascript
复制
t_teacher:
t_id, t_name, s1, s2, s3

其中t_id是主键,t_name是教师姓名,(s1,s2,s3)是数学、物理、化学等科目。

代码语言:javascript
复制
t_result:
r_id, s_name, t_name, count

其中r_id是主键,s_name是学生姓名(来自学生表),t_name是教师姓名(来自教师表),count提供计数(稍后将详细介绍)

现在,我想做的事情如下:

在学生和教师表中可以有任意数量的记录,但到目前为止在结果表中没有记录。现在,我想使用mySQL扫描学生表的内容,对于表中的每条记录,我想要拾取:

s1,然后将该值与教师表s2中的(s1,s2,s3)列进行比较,然后将该值与教师表s3中的(s1,s2,s3)列进行比较,然后将该值与教师表中的(s1,s2,s3)列进行比较

获取匹配值的数量并存储在count中。

为了更清楚起见,如果对于学生表中的第一条记录,s1,s2和s3是"phy","chem“和"maths",如果教师表中的第一条记录是"maths","phy","computer",那么在这种情况下,student.s1与teacher.s2匹配-所以现在计数是1。然后student.s2与教师表中的s1,s2,s3匹配,但是匹配是0,所以计数保持为1;再次将student.s3与教师表中的s1、s2、s3进行匹配,这一次它与teacher.s1匹配,因此计数递增到2。因此,在学生表中的第一条记录与教师表中的第一条记录的比较结束时,我得到了count=2。现在,我将在结果表中插入一行,其中包含学生姓名、教师姓名和获得的计数。

基本上,我想要获得学生表和教师表之间的s1,s2,s3匹配的数量,对于学生表中的每一行,然后将其放入结果表中。

我只知道mysql中的基本操作,比如选择、插入、删除等。我假设这样的操作需要更多的东西,比如plsql和存储过程?

仅供参考,我使用的是phpmyadmin,表存储在那里。我将使用php从表中获取结果,并执行这些查询。

请告诉我解决这个问题的方法。

谢谢!

EN

回答 4

Stack Overflow用户

发布于 2012-10-14 02:57:48

您的数据库设计需要一些工作。首先对数据进行规范化,将重复的主题列从教师表和学生表中移出。您可以通过创建以下表格来完成此操作:

代码语言:javascript
复制
CREATE TABLE t_subjects ( subject_id INT, name VARCHAR(30) );
CREATE TABLE t_teacher_subjects ( teach_id INT, subject_id INT);
CREATE TABLE t_student_subjects ( student_id INT, subject_id INT);

从teacher和student中删除s1、s2、s3列,然后您就可以在一个查询中填充结果表(假设它有一个auto_increment主键),如下所示:

代码语言:javascript
复制
insert into t_result (s_name, t_name, count) 
select t_teacher.t_name, t_student.s_name, count(*) as c from
t_teacher_subjects 
    inner join t_student_subjects on t_teacher_subjects.subject_id = t_student_subjects.subject_id
    inner join t_teacher on t_teacher_subjects.teach_id = t_teacher.t_id
    inner join t_student on t_student_subjects.student_id = t_student.s_id
group by t_teacher.t_name, t_student.s_name;
票数 1
EN

Stack Overflow用户

发布于 2012-10-14 03:06:00

您应该修改您的表以

代码语言:javascript
复制
t_student:
s_id, s_name, s_s

代码语言:javascript
复制
t_teacher:
t_id, t_name, t_s

并将您的s1、s2、s3拆分为单独的行。然后,您可以在t_student和t_teacher之间执行一个简单的连接。

票数 1
EN

Stack Overflow用户

发布于 2012-10-14 02:37:08

实际上,您不需要任何过程代码来解决这个问题。这种方法被称为“规范化”。您需要多个表来表示教师的科目,以便s1、s2、s3值转到单独表中的单个列,该表与教师表具有外键关系。其他关系也是如此。(这就是为什么术语“关系数据库”放在首位的原因。)

这里有一个相关的讨论:DB Design: 1st Normal Form and Repeating Groups

编辑

看起来像是一个任务,而不是生产问题:)。无论如何,您仍然可以尝试在查询而不是模式中使用一种复杂的纯SQL方法来进行规范化。很奇怪,但也不是不可能。

这就是这个技巧的精髓。使用下面的子查询来获得数据的规范化表示:

代码语言:javascript
复制
select s_id, s_name, s1 s from t_student
union
select s_id, s_name, s2 s from t_student
union
select s_id, s_name, s3 s from t_student
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12875626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档