2012-10-13 21 views
1

我试图找出如何使用此方案中的MySQL去 -如何获得柱之间的匹配数量在两个表中的MySQL

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

t_student: 
s_id, s_name, s1, s2, s3 

其中S_ID是主键,S_NAME是学生姓名,(S1,S2,S3)是受试者像数学,PHY,化学等。

t_teacher: 
t_id, t_name, s1, s2, s3 

其中T_ID是主键,t_name是老师的名字,(S1,S2,S3)的科目,如数学,物理层,化学等。

t_result: 
r_id, s_name, t_name, count 

其中R_ID是主键,S_NAME是学生名称(从学生表),t_name是老师的名字(从老师表)和计数给出数(更详细的介绍了一下)

现在,我想要做的是如下:

有可以是学生和教师表中的任意数量的记录,并且现在不在结果表中。现在,使用mySQL我想扫描学生表的内容,并且对于此表中的每个记录,我想拾取:

s1,然后将该值与(s1,s2,s3)列中的值进行比较表 S2,然后比较在老师表 S3与(S1,S2,S3)列中的值,然后比较值(S1,S2,S3)在老师表列

和获得匹配的数量值和存储数量。如果对于学生表中的第一条记录,s1,s2和s3是“phy”,“chem”和“maths”,并且如果teacher表中的第一条记录是“maths”,则“phy “,”computer“,那么在这种情况下,student.s1与teacher.s2匹配 - 现在count为1,则student.s2与teacher表中的s1,s2,s3匹配,但match为0,因此count保持1;再次将student.s3与教师表中的s1,s2,s3进行匹配,这次它与teacher.s1匹配,因此计数递增到2.因此,在学生表中的第一个记录与教师的第一个记录比较结束时表,我得到count = 2。现在,我会在结果表中插入一行,并附上学生姓名,教师姓名和计算结果。

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

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

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

请让我知道这个方法。

谢谢!

回答

0

其实,你不需要任何程序代码来解决这个问题。这种方法被称为 “正常化”。您需要多个表来表示教师的主题,以便s1,s2,s3值可以在单独的表中与列表中的外键关联。其他关系一样。 (这就是为什么“关系数据库”一词的原因。)

相关讨论在这里:DB Design: 1st Normal Form and Repeating Groups

编辑

看起来像一个分配,而不是生产的问题:)。无论如何,您仍然可以尝试使用错综复杂的纯SQL方法来在查询中进行标准化,而不是在模式中进行标准化。奇怪但并非不可能。

这是关键技巧的本质。将此用作子查询以获得数据的标准化表示:

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

感谢您关注此事,但我想你误解了我的要求。两个表中的记录都不同,并且来自不同的来源(高层次),并且不是真正的依赖。所以第三张表 - 结果表是非常必要的。可能我没有完全解释事情,但相信我这不是正常化。 我只想知道如何通过将每个学生(s1,s2,s3)与老师(s1,s2,s3)进行匹配来确定COUNT。 再次感谢。 – kallakafar

+0

很有可能,我们都错过了这一点。但它看起来仍然在这里的所有答案基本上是相同的:消除一个重复的组s1,s2,s3,并使用一对多的关系。这确实是正常化。 –

+0

是的..我想我的问题还不够清楚!我想我需要编写程序,然后获得匹配计数,然后输入结果表。现在正在研究这种方法。无论如何,感谢您的帮助:) – kallakafar

1

您的数据库设计需要一些工作。从标准化数据开始,将重复的主题列移出教师和学生表。你可以通过创建以下表格做到这一点:

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); 

取出S1,S2,从教师和学生S3列,然后你就可以填充你的结果表(只要它具有AUTO_INCREMENT主键)在单个查询 - 这样的事:

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; 
+0

谢谢,但我再也不能将主题从其他表中移出。实际上,我的学生表科目和老师表科目完全不同,而且他们之间没有相关性。这两个表是独立的。我的要求是匹配主题以查看它是否存在于任何教师表列中,并获得Count中匹配主题的数量。我想我已经让我原来的帖子稍微混淆了,但是这些表格不能进一步标准化。任何方式获得计数没有正常化? – kallakafar

1

你应该修改你的表到

t_student: 
s_id, s_name, s_s 

t_teacher: 
t_id, t_name, t_s 

并将s1,s2,s3拆分为不同的行。然后你可以在t_student和t_teacher之间做一个简单的连接。

0

好吧。感谢您的挑战。一个不错的心理锻炼:)。

下面是查询;只是把它转换成一个插入:

select s_name, t_name, count(*) cnt from 
(
select s.s_name, s.s s_s, t.t_name, t.s t_s from 
(
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 
) s 
inner join 
(
select t_id, t_name, s1 s from t_teacher 
union 
select t_id, t_name, s2 s from t_teacher 
union 
select t_id, t_name, s3 s from t_teacher 
) t 
on t.s = s.s 
) m 
group by s_name, t_name 
; 

编辑:实际运行:

mysql> select * from t_student; 
+------+--------+------+------+------+ 
| s_id | s_name | s1 | s2 | s3 | 
+------+--------+------+------+------+ 
| 1 | st1 | qqq | www | eee | 
| 2 | st2 | 111 | 222 | 333 | 
| 3 | st3 | zzz | xxx | ccc | 
+------+--------+------+------+------+ 
3 rows in set (0.00 sec) 

mysql> select * from t_teacher; 
+------+--------+------+------+------+ 
| t_id | t_name | s1 | s2 | s3 | 
+------+--------+------+------+------+ 
| 1 | te1 | qqq | www | eee | 
| 2 | te2 | 111 | 222 | nnn | 
| 3 | te3 | zzz | nnn | nnn | 
+------+--------+------+------+------+ 
3 rows in set (0.00 sec) 

mysql> select s_name, t_name, count(*) cnt from 
    -> (
    -> select s.s_name, s.s s_s, t.t_name, t.s t_s from 
    -> (
    -> 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 
    ->) s 
    -> inner join 
    -> (
    -> select t_id, t_name, s1 s from t_teacher 
    -> union 
    -> select t_id, t_name, s2 s from t_teacher 
    -> union 
    -> select t_id, t_name, s3 s from t_teacher 
    ->) t 
    -> on t.s = s.s 
    ->) m 
    -> group by s_name, t_name 
    -> ; 

+--------+--------+-----+ 
| s_name | t_name | cnt | 
+--------+--------+-----+ 
| st1 | te1 | 3 | 
| st2 | te2 | 2 | 
| st3 | te3 | 1 | 
+--------+--------+-----+ 
3 rows in set (0.00 sec) 
+0

嗯..不错的工作,但仍然没有答案是我在找什么。 :) – kallakafar

+0

为了更加清楚,如果对于学生表中的第一条记录,s1,s2和s3是“phy”,“chem”和“maths”,并且如果teacher表中的第一条记录是“maths”,“phy” ,“computer”,那么在这种情况下,student.s1与teacher.s2匹配 - 因此现在count为1,则student.s2与teacher表中的s1,s2,s3匹配,但match为0,因此count是保持1;再次将student.s3与教师表中的s1,s2,s3进行匹配,这次它与teacher.s1匹配,因此计数递增到2. – kallakafar

+0

因此,在学生表中的第一条记录与教师的第一条记录比较结束表,我得到count = 2。现在,我会在结果表中插入一行,并附上学生姓名,教师姓名和计算结果。 – kallakafar

相关问题