Sql 返回drupal节点的最新版本
我正在编写一个drupal模块,需要编写一个查询,返回我的一个content\u类型表的特定行。到目前为止,我的问题是:Sql 返回drupal节点的最新版本,sql,drupal,drupal-6,Sql,Drupal,Drupal 6,我正在编写一个drupal模块,需要编写一个查询,返回我的一个content\u类型表的特定行。到目前为止,我的问题是: SELECT DISTINCT pb.*, f.filepath FROM {content_type_promo_box} pb LEFT JOIN {files} f ON pb.field_promo_image_fid = f.fid 我在工作时意识到,该表不仅包含此内容类型的每个cck字段,还包含每个字段的多个版本。如何将查询限制为仅包含当前节点版本的值的行 更新
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 |
-------------
有道理吗?谢谢 您最好使用获取加载对象,而不是自己编写查询 甚至可以用来做你需要的事情 在为自己编写查询时这样做的原因是Drupal及其模块作为一个框架坐在一起。大多数情况下,您会希望使用该框架来做您想做的事情,而不是绕过它来编写您自己的查询。将来,如果升级Drupal或模块节点,加载()仍然可以工作,但代码可能无法工作 假设
(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)
节点表存储节点的当前版本,修订ID在所有内容中都是唯一的。这使得查询非常简单:
SELECT m.*
FROM
{mytable} AS m
JOIN {node} AS n
ON m.vid = n.vid
如果节点的
{mytable}
中没有内容,则查询不会返回该内容;更改为右连接
以返回所有节点。什么意思,修改的节点或多值字段?在最后一行中将“q.vid”更改为“q.mvid”之前,我遇到了一个错误。然后它成功了。谢谢您不能简单地假设MAX(vid)将返回当前版本。进行修订的目的是可以恢复到以前的版本,对吗?您应该从节点表中检索nid的当前vid,而不是搜索最高版本id。话虽如此,我倾向于同意Jeremy French的答案。但是,恢复到以前的版本不会创建新的版本id吗?一些模块在获得批准之前不会发布最新版本。在这种情况下,最高版本不是当前版本。因为版本ID在所有内容中都是唯一的,并且存储在nodes表中,所以不需要子查询。检查我的查询答案,该查询应避免任何MAX()问题。