我正在编写一个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 |
-------------
有意义吗?谢谢!
答案 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)