【问题标题】:MySQL join two tables and add extra columnsMySQL连接两个表并添加额外的列
【发布时间】:2021-10-29 14:10:31
【问题描述】:

我有三个表,如下所示。 topic_table 将通过插入来自 grades_table 和 subject_table 的值以及作为输入(主题名称)或计算(修订日期)的一些其他字段来创建。

成绩表

grade_id grades sections
1 1 A
2 1 B

subjects_table

subject_id grade_id teacher_id subject_name
1 1 1 Maths
2 2 2 English

topics_table(注意:此表当前为空)。

我想将成绩和科目表中的grade_id 和subject_id 的值添加到该表中。基本上,我正在考虑加入主题表和成绩表,并从中提取所需的值,并将其放在此表中的成绩 id 和主题 id 列下,同时还输入来自用户的 topic_name 和来自系统的修订日期。

topic_id grade_id subject_id topic_name revision_one revision_two revision_three
1 1 1 Adding Fractions 28-10-2021 28-11-2021 28-12-2021
2 2 2 Nouns 01-11-2021 01-12-2021 01-01-2022

现在,我正在使用 join 在 topic_table 中插入grade_id 和 subject_id 的值,但问题是我无法接收 topic_name 和修订日期,因为它们是无法从另一个表中获取的额外列使用连接。 下面是我现在用来获取topics_table 的MySQL 查询。它只给出grade_id 和subject_id。

如何获得额外的列?

请注意,当输入 topic_name 时,每次使用相同的查询都会更新此表。

这里,$chooseGrade、$chooseSubject、$chooseSection 是我将通过表单从用户那里收到的输入。 $teacherId 是使用不同的查询从另一个表接收到的。

如果有其他方法可以从成绩表和科目表中获取值并将其放入主题表中,请告诉我。我尝试使用 SQL 变量,但即使这样也没有用。代码也给出了。

INSERT INTO topics_table (subject_id, grade_id, $topicName , CURRENT_DATE(),CURRENT_DATE()+INTERVAL 1 DAY,CURRENT_DATE()+INTERVAL 7 DAY,CURRENT_DATE()+INTERVAL 30 DAY,CURRENT_DATE()+INTERVAL 90 DAY,CURRENT_DATE()+ INTERVAL 180 DAY)
SELECT G.grade_id, S.subject_id
FROM grades_table G
INNER JOIN subjects_table S
WHERE G.grade_id = S.subject_id
AND G.grades  = $chooseGrade
AND G.sections = $chooseSection
AND S.subject_name = $chooseSubject
AND S.teacher_id = $teacherId 

//using variables NOT joins

SELECT  grade_id INTO @grade_id FROM grades_table WHERE grades = '$chooseGrade' AND sections = '$chooseSection';
SELECT subject_id INTO @subject_id FROM subjects_table WHERE grade_id = @grade_id AND subject_name = '$chooseSubject' AND teacher_id = '$teacherId';
INSERT INTO topics_table ( subject_id, grade_id, topic_name, revision_one, revision_two, revision_three) VALUES (@subject_id, @grade_id,'$topicName',CURRENT_DATE()+INTERVAL 30 DAY,CURRENT_DATE()+INTERVAL 60 DAY,CURRENT_DATE()+ INTERVAL 90 DAY);

【问题讨论】:

    标签: mysql sql join inner-join


    【解决方案1】:

    你会注意到我用占位符替换了变量

    topic about sql injection

    另一件事是你加入表单你的查询对我来说似乎不正确,因为 Grades_id 应该引用 Grades 和 subject 而不是 subject_id

    topics_table Grades_id 也是如此,似乎也是多余的,所以你应该看看规范化

    SELECT G.grade_id, S.subject_id,t.topic_name,t.revision_one,    t.revision_two ,    t.revision_three
    FROM grades_table G
    INNER JOIN subjects_table S ON G.grade_id = S.grade_id 
    INNER JOIN topics_table t ON t.grade_id = s.grade_id AND t.subject_id = s.subject_id
    
    WHERE G.grades  = ?
    AND G.sections = ?
    AND S.subject_name = ?
    AND S.teacher_id = ?
    

    【讨论】:

    • 哦,实际上 topic_name 和 subject_name 是不同的。我刚刚编辑了问题
    • 但是当 subject_name 在subjects 表中时,如何通过grades_id 引用subject_name?并修复了topics_table中的grades_id。我看到您实际上专注于表内的值。我实际上是随意放置它们并且没有注意,因为我认为这无关紧要。我尝试使用您编写的代码,但它仍然对我不起作用。此外,它仍然无法解决问题。我将如何输入从输入和修订日期收到的 topic_name 的值作为当前日期?
    • 我查看了您的表格并查看了它们之间的链接,这些链接位于 on 子句中,minimal reproducible example 必须代表您的实际数据,否则我们会得出错误的结论,因此为了更好地了解具体情况使用嵌入的 id 进行查询并从该查询中获得想要的结果,但查询仍然应该是有用的
    【解决方案2】:

    如果你想得到一个表作为输出,你应该使用合并

    MERGE Subject S
    USING Grade G
    ON (S.SubjectID = G.GradeID)
    WHEN MATCHED
    THEN UPDATE SET
    COLUMNAME = COLUMNNAME,
    COLUMNNAME = COLUMNANAME
    WHEN NOT MATCHED BY TARGET
    THEN INSERT (XYZ, ABC, ABZ)
    VALUES(XYZ,ABC,ABZ)
    WHEN NOT MATCHED BY SOURCE
    THEN DELETE
    

    注意:使用您自己的值代替 xyz、abc 等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-17
      • 2015-10-07
      • 2011-01-20
      • 1970-01-01
      • 2019-05-06
      • 2021-10-09
      • 2015-11-20
      • 2021-10-12
      相关资源
      最近更新 更多