MySQL SELECT并返回未知数量的相关外键

时间:2011-03-26 22:21:15

标签: mysql sql join foreign-keys

我在数据库中有两个表,看起来像这样

课程:

  • ixCourse(主键)
  • enType(枚举:3个可能的值)
  • sCourse(string)
  • sTitle(string)
  • sWhen(string)
  • sDescription(string)

档案:

  • ixItem(主键)
  • ixCourse(外键参考Course.ixCourse)
  • bLink(布尔)
  • sAddress(string)
  • sDescription(string)

在此设置中,我可以拥有一个给定的课程,我可以为任何课程提供多个相关的项目。每个课程没有统一的项目数。我是否需要执行单独的查询来为每个课程提取所有相关项目,或者我可以在1个选择语句中执行此操作而不返回冗余信息吗?

3 个答案:

答案 0 :(得分:1)

without returning redundant information?如果你的意思是不重复课程细节,那么不 - 不容易在一个查询中。 有一些可怕的查询(就想法和代码而言)以返回以下内容:但我不建议去探索它。

ixCourse, enType .. , ixItem, sDescription
1         1           1       first for course 1
                      2       Second for course 1   << notice no course details
2         1           3       first for course #2

但通常的做法是在两个产生

之间加入
ixCourse, enType .. , ixItem, sDescription
1         1           1       first for course 1
1         1           2       Second for course 1   << course details repeated per item
2         1           3       first for course #2

对此类的查询将是

select c.*, i.*
from course c
left join item i on c.ixCourse = i.ixCourse

我在这里使用了LEFT JOIN,这可能会产生这种情况(例如,课程2没有项目)

ixCourse, enType .. , ixItem, sDescription
1         1           1       first for course 1
1                     2       Second for course 1   << course details repeated
2         1           NULL    NULL                  << nothing for item columns
3         1           4       first for course #3

将其更改为INNER JOIN(或缩写为JOIN)将删除没有说明的课程。

答案 1 :(得分:0)

只需使用加入:

SELECT * FROM Course C
JOIN Item I ON C.ixCourse=I.ixCourse

是的,您将重复学习课程信息..没有办法只返回一行课程数据,然后返回多个项目行而不进行两次查询。如果这就是你要问的话,你可以在一个查询中只返回一门课程的价值。

答案 2 :(得分:0)

目前还不清楚你想要什么作为输出,但是这个:

   SELECT c.*, i.*
     FROM COURSE c
LEFT JOIN ITEM i ON i.ixcourse = c.ixcourse

...将返回所有课程以及与课程相关的任何项目。如果课程没有与之相关的项目,则输出中的ITEM列将为NULL。也就是说,如果有多个与之相关的项目,课程列将保留重复值 - 但ITEM列将有所不同。

如果您只想要包含项目的课程列表,请使用:

SELECT c.*, i.*
  FROM COURSE c
  JOIN ITEM i ON i.ixcourse = c.ixcourse

什么是加入?

这是good primer on JOINs, and the differences between them