Drupal使用不存在的节点创建涉及LEFT JOIN Sub-Select的视图

时间:2011-06-15 17:16:10

标签: drupal join views subquery

我正在使用Drupal 6 我有这个表关系,我已经完成了与它的关系的CCK。 基本上,当我查看Period节点时,我有标签显示所有Faculty节点和Presence Number。

这是表格图表:http://i.stack.imgur.com/7Y5cU.png 像这样翻译成CCK: CCK学院(姓名), CCK期间(desc,from,to)和 CCK Presence(node-reference-faculty,node-reference-period,presence_number)

这是我实现此结果的简单手动SQL查询:http://i.stack.imgur.com/oysd3.png

SELECT faculty.name, presence.presence_number FROM Faculty AS faculty
LEFT JOIN (SELECT * FROM Presence WHERE Period_id=1) AS presence ON faculty.id=presence.Faculty_id

Period_id的值1将由url参数的Period Node ID给出。

现在最困难的部分是将上面的简单SQL查询模拟到Views中。如何在Drupal-6或Drupal-7中查看视图?

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

我认为您注意到的主要问题是,如果您将Faculty视为您加入的基础,那么就无法加入Presence节点。相反,如果你把存在作为基础,那么你就不会看到没有存在号码的院系。

使用您当前定义的结构,在视图中执行这些连接是没有简单的方法。 我想说你最简单的选择是从在线节点中删除'node-reference-faculty'字段,并向教师添加一个node-reference-presence字段。由于CCK字段可以有多个值,因此您仍然可以正确地建立一对多关系。

这样做的一个缺点是,您需要从教师节点而不是在线节点管理在场 - 教师关系。如果这是一个显示停止,它可能取决于您的工作流程,您可以有两个节点参考字段,并使用像http://drupal.org/project/backreference这样的模块来保持它们同步。

一旦您获得教师的参考 - >存在,您需要在视图中添加关系。就像添加字段或过滤器一样,打开关系列表并找到节点参考字段的关系列表。

接下来,您需要为句点ID添加一个参数,并将其设置为使用url中的节点ID。关键是当你添加参数时,它将询问在其选项中使用哪个关系。您将要告诉它使用您新添加的状态关系。

你真的不需要像你那样在你的SQL中做一个子查询。这应该是同样的事情,不会让mysql尝试创建一个临时表。我之所以提到它是因为除非你编写一个非常自定义的视图处理程序,否则你不能在视图中真正做子查询,但在这种情况下你还是不需要子查询。

实施例

SELECT f.name, p.presence_number
FROM Faculty AS f
LEFT JOIN Presence AS p ON f.id=p.Faculty_id
WHERE p.Period_id=1;

答案 1 :(得分:-1)

我写了一篇关于如何在这里取得类似结果的文章。 http://scottanderson.com.au/#joining-a-views-query-to-a-derived-table-or-subquery

基本上如何在子查询中将视图查询更改为左连接。