【问题标题】:return latest version of a drupal node返回最新版本的 drupal 节点
【发布时间】:2010-01-13 05:22:35
【问题描述】:

我正在编写一个 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 (不过,谢谢你的回答,杰里米!)。真的,我的问题更多是关于如何编写适当的 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 |
-------------

有意义吗?谢谢!

【问题讨论】:

  • 你是什么意思,修订节点或多值字段?

标签: sql drupal drupal-6


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    假设(nid, vid)组合是unqiue:

    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)
    

    【讨论】:

    • 在最后一行将“q.vid”更改为“q.mvid”之前出现错误。然后它起作用了。谢谢!
    • 您不能简单地假设 MAX(vid) 将返回当前版本。进行修订的目的是您可以恢复到以前的版本,对吗?您应该从节点表中检索您的 nid 的当前 vid,而不是搜索最高版本 id。说到这里,我倾向于最同意 Jeremy French 的回答,stackoverflow.com/questions/2054629/…
    • 不过,恢复到以前的修订版不会创建新的修订版 ID 吗?
    • 某些模块在获得批准之前不会发布最新版本。在这种情况下,最高版本不是当前版本。
    • 由于版本 ID 在所有内容中都是唯一的并存储在节点表中,因此不需要子查询。检查我对查询的回答,该查询应该避免任何 MAX() 问题。 stackoverflow.com/questions/2054629/…
    【解决方案3】:

    您最好使用node_load() 来获取加载对象,而不是尝试自己编写查询。

    或者甚至使用views 来做你需要的事情。

    这样做而不是为自己编写查询的原因是 Drupal 和它的模块作为一个框架坐在一起。大多数时候,您会希望使用该框架来做您想做的事情,而不是单步执行它来编写您自己的查询。将来,如果您升级 Drupal 或模块 node_load() 仍然可以工作,但您的代码可能不会。

    【讨论】:

      猜你喜欢
      • 2015-10-02
      • 1970-01-01
      • 2018-03-25
      • 2019-01-04
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 2023-03-23
      • 2021-12-31
      相关资源
      最近更新 更多