使用连接的SQL查询

时间:2013-09-15 15:59:35

标签: php mysql sql

我有2张桌子 - 学生,考试

学生表架构:

id  Name  Course
1   Kavi   Dr.
2   Priya  Engg.

考试表架构:

Examid Student_id  Exam Date
1        1          22-03-2014
2        2          23-04-2014
3        1          24-04-2014

我的要求是,我需要加入这两个表,以便我可以访问该表中的所有列。到目前为止,我已经尝试使用Innerjoin查询,但我得到的结果是

id  Name  Course
1   Kavi   Dr.
2   Priya  Engg.
1   1      22-03-2014
2   2      23-04-2014

但我需要它,

id Name Course Exam Date
1  Kavi  Dr.    22-03-2014
1  Kavi  Dr.    24-04-2014
2  Priya Engg.  23-04-2014

请帮助!

编辑:

SELECT *
FROM STUDENT S INNER JOIN
     EXAM E
     ON S.id=E.Student_id 

6 个答案:

答案 0 :(得分:1)

我会给你查询,但首先你应该花点时间了解一下select语句是如何工作的。

当您运行select语句时,您可以将其想象为定义一个完全临时的表,该表只在您查找时才存在片刻。这更好地称为查询结果。

您选择的列列表实际上会成为新表的列。 “FROM”决定使用哪些表来映射这些列。 “WHERE”和“HAVING”子句决定引擎在确定要包含的行时应使用的规则。

那么,您希望在结果中使用哪些列?

  • student.id
  • student.name
  • student.course
  • exam.date

您正在从学生和考试表中进行选择,但您希望根据学生ID“合并”行(这是JOIN的来源 - 您应该查看this以获得更好的效果了解JOIN如何工作)

最后,听起来你想要一切,所以没有WHERE / HAVING子句。

所以你的查询应该是这样的:

SELECT student.id, student.Name, student.Course, exam.Date
  FROM student
  JOIN exam ON student.id = exam.Student_id

现在,请注意,您应该为列保持一致的命名结构。我建议你总是开始小写(因此它将是student.course)并且我个人总是在数据库定义中避免使用大写字母。至少,以国会大厦字母开头的东西通常表示编程之地的类或对象名称

听起来你有兴趣处理重复项。您还想查看“DISTINCT”和“GROUP BY”等关键词。

另外......在提问时你需要提供更多信息。解释你的尝试。以有组织的方式解释所有要求和目标。你明白了。

答案 1 :(得分:0)

尝试此查询

SELECT s.*, e.exam_date FROM student_tbl s
JOIN exam_tbl e ON e.student_id = s.id

答案 2 :(得分:0)

试试这个

SELECT st.id,st.name,st.course,ex.date FROM student AS st 
LEFT JOIN exam AS ex ON ex.student_id=st.id

答案 3 :(得分:0)

尝试此查询:

SELECT Student.id ,Student.Name,Student.Course,`Exam.Exam Date`
FROM Student
INNER JOIN EXAM
ON Student.id=EXAM.Student_id;

答案 4 :(得分:0)

SELECT
    S.id, S.Name, S.Course, `E.Exam Date`
FROM
    Student S, Exam E
WHERE
    S.id = E.Student_id

我仍然觉得你的桌面存在严重的设计缺陷 - 没有桌子将课程定义为从哪里获取课程信息(例如名称)的实体。如果你能够改变它,那么一些规范化对你有好处。

答案 5 :(得分:0)

我相信您的查询问题很微妙。查询本身是正确的,所以这就是你想要的:

SELECT *
FROM STUDENT S INNER JOIN
     EXAM E
     ON S.id=E.Student_id 

不过,不过,你得到的是cross join而不是inner join。这可能会发生,因为你真的正在执行:

SELECT *
FROM STUDENT S INNER JOIN
     EXAM E

在MySQL中,on子句是可选的,因此您不会收到错误。如果是这样,只需添加on子句就可以解决问题。

注意:这可能是由查询中的分号引起的:

SELECT *
FROM STUDENT S INNER JOIN
     EXAM E;
     ON S.id=E.Student_id