返回最新版本的drupal节点

时间:2010-01-13 05:22:35

标签: sql drupal drupal-6

我正在编写一个drupal模块,我需要编写一个返回我的content_type表之一的特定行的查询。到目前为止,我的查询是:

SELECT DISTINCT pb.*, f.filepath FROM {content_type_promo_box} pb LEFT JOIN {files} f ON pb.field_promo_image_fid = f.fid

我意识到,当我工作时,该表不仅包含此内容类型的每个cck字段,还包含每个字段的多个版本。如何将查询限制为仅包含当前版本节点值的行?

更新:我需要澄清一下我的问题。我已经在视图路径上了,我确实考虑过使用node_load(感谢答案,但Jeremy!)。真的,我的问题更多的是关于如何编写适当的SQL语句而不是drupal。我只想为任何特定节点(nid)返回包含最新版本(vid是最大版本)的行。所以这是一个例子:

-------------
| nid | vid |
-------------
| 45  |  3  |
| 23  |  5  |
| 45  |  9  |
| 23  |  12 |
| 45  |  36 |
| 33  |  44 |
| 33  |  78 |
------------- 

我的查询应返回以下内容:

-------------
| nid | vid |
-------------
| 23  |  12 |
| 45  |  36 |
| 33  |  78 |
-------------

有意义吗?谢谢!

3 个答案:

答案 0 :(得分:4)

节点表存储节点的当前版本,并且修订ID在所有内容中都是唯一的。这使得查询非常简单:

SELECT  m.*
FROM    
    {mytable} AS m
JOIN {node} AS n
ON m.vid = n.vid

如果节点的{mytable}中没有内容,则查询不会返回该内容;更改为RIGHT JOIN以返回所有节点。

答案 1 :(得分:2)

使用node_load()来获取加载对象而不是尝试自己编写查询可能会更好。

甚至可以使用views来做你需要的事情。

这样做的原因是为自己编写查询是Drupal和它的模块一起作为框架。大多数情况下,您会希望使用该框架来执行您想要的操作,而不是将其用于编写您自己的查询。将来如果你升级Drupal或模块node_load()仍然可以工作,但你的代码可能没有。

答案 2 :(得分:2)

假设(nid, vid)组合是唯一的:

SELECT  m.*
FROM    (
        SELECT  nid, MAX(vid) AS mvid
        FROM    mytable
        GROUP BY
                nid
        ) q
JOIN    mytable m
ON      (m.nid, m.vid) = (q.nid, q.mvid)