我知道我要下去选民,但我要确定如果这是合乎逻辑的或没有。

我有三个表格A,B,C。B表中的使用使许多多关系之间的A和C。但事实是,一个和C是也涉及直接在一个1-很多关系

一个客户增加以下要求:

获得信息从表B内加入一个和C节,和在同样的查询涉及一个C在一个多关系

是这样的:

alt文本http://img247.imageshack.us/img247/7371/74492374sa4.png

我试图做的查询,但总是有0行回来。客户坚持认为,我可以完成的要求,但我对此表示怀疑。任何意见?

PS。我没有一种更具描述性的标题,任何想法?

更新:由于rcar,在某些情况下这可能是合乎逻辑的,为了具有历史的所有课程的学生已采取的(如果该学生只能采取一种类在一段时间)

更新:有一个表接触,表与的信息的每一个联系和关系表。获得信息的接触,我要作一个1:1的关系的信息,并且每个接触可能有像和地址簿;这就是为什么许多多关系是实现的。

全部的想法是取得联系人的名字和他的地址簿。现在,我得到了客户的想法...我有麻烦的查询,基本上我正尝试使用的查询jdecuyper写的,但他警告说,我没有得到任何数据的背面

有帮助吗?

解决方案

我假设。id_class指示的学生的前类,而不是上课,她已经过去。

该解决方案所示,通过rcar工作,但它重复c1。className上的每一个行。

这是一种替代,这并不重复的信息以及它使用一个较少的参加。你可以使用一个表,以比较。id_class目前c。id_class匹配的通过mtm表。

SELECT s.name, c.className, (s.id_class = c.id_class) AS is_current
FROM s JOIN many_to_many AS mtm ON (s.id_student = mtm.id_student)
  JOIN c ON (c.id_class = mtm.id_class);

所以is_current将1(true)在一个行和0(false)在所有其他行。或者你可以输出的东西更多信息的使用 CASE 结构:

SELECT s.name, c.className, 
  CASE WHEN s.id_class = c.id_class THEN 'current' ELSE 'past' END AS is_current
FROM s JOIN many_to_many AS mtm ON (s.id_student = mtm.id_student)
  JOIN c ON (c.id_class = mtm.id_class);

其他提示

这是一个可行的情况。你可以加入一个表两次查询,通常分配一个不同的别名,以保持。

例如:

SELECT s.name AS "student name", c1.className AS "student class", c2.className as "class list"
FROM s
JOIN many_to_many mtm ON s.id_student = mtm.id_student
JOIN c c1 ON s.id_class = c1.id_class
JOIN c c2 ON mtm.id_class = c2.id_class

这会给你一个列表中的所有学生的名字和"硬编码"类,其所有课程,从many_to_many表。

这就是说,这种模式不合乎逻辑的意义。从什么我可以收集,你要学生能够具有多个课程,所以many_to_many表应该在那里你会想要找到类相关的一个学生。如果id_class项中使用的表都是不同于那些在many_to_many(例如,如果s.id_class指的是,比如说,班主任课堂作业,只有出现在该表的同时many_to_many.id_class指类信贷,并不包括班主任类),你会好起分裂c入两个表格代替。

如果不是这种情况下,我很难理解为什么你想一类的硬连线s表。

编辑:只看到了你的评论,这是一个架构,以举一个例子。在其他情况下,这可能是一个明智的方式来做事情。例如,如果你想跟踪的公司地点,可能有一个公司表,一个地点的表,以及一个国家表。该公司表可能会有1-许多链接的国家,你将跟踪的一家公司的总部国家,但是许多对多链接的地点在哪里,你跟踪每一个地方公司拥有一家商店。

如果你可以得到真实信息,以什么样的模式确实表示,对您的客户,这可能是我们更容易弄清楚是否这是合乎逻辑的,在这种情况下或没有。

也许这是一个缺乏咖啡因的,但是我不能想象一个正当的理由希望这样做。在例你了,你得学生,课程和一个表,其中涉及的两个。如果你想你想要的查询做到,在简单的英语,当然,它已经被驱动通过 student 表或 class 表。即

  • 选择的所有类别都参加了学生1245235
  • 选择的所有学生参加课101

你能解释的要求更好吗?如果不是,告诉你的客户以吸起来。具有关系的学生和课程直接(A和C),似乎是纯的疯狂,你已经得到了表B,这不是...

铭记,一项对多关系表示可以通过许多对多,最简单地添加一领域里表明类型的关系。然后你可以有一个"当前"的记录以及任何数量的"历史"。

是的客户"要求"的措辞如,通过的方式?我想我会找到重新定义我与他们的关系如果是这样:他们应该告诉我"什么"他们想要(理想的是什么,在业务领域的语言,他们的问题)和离开的"如何"给我。如果他们知道到底是怎么一回事,应该以实施,然后我会倾向于开放源码在一个编辑和离开他们!

它似乎没有意义。查询如:

SELECT * FROM relAC RAC
  INNER JOIN tableA A ON A.id_class = RAC.id_class 
  INNER JOIN tableC C ON C.id_class = RAC.id_class 
    WHERE A.id_class = B.id_class

可能会产生一组数据,但不一致。或者,也许我们缺少一些重要组成部分的有关内容的信息和关系的那些3个表。

我个人从来没有听说过一个要求从客户那声音听起来像:

获得的信息表 B内加入一个和C,并在 同样的查询涉及A和C中的一个 一个多关系

它看起来像是你的翻译要求。你能指定的要求在普通英文,为什么样的结果你的客户想要得到什么?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top