вернуть последнюю версию друпального узла - PullRequest
4 голосов
/ 13 января 2010

Я пишу модуль 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. Я хочу только вернуть строки, которые содержат последние версии (vid является наибольшим) для любого конкретного узла (nid). Итак, вот пример:

-------------
| 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 ]

4 голосов
/ 23 января 2010

В таблице узлов хранится текущая версия узла, а идентификаторы версий уникальны для всего содержимого. Это делает довольно простой запрос:

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

Если в {mytable} для узла нет содержимого, оно не будет возвращено запросом; измените на RIGHT JOIN, чтобы вернуть все узлы.

2 голосов
/ 13 января 2010

Предполагая, что комбинация (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)
2 голосов
/ 13 января 2010

Возможно, вам лучше использовать node_load () , чтобы получить объект загрузки, а не пытаться написать запрос самостоятельно.

Или даже используйте просмотров , чтобы сделать то, что вам нужно. * +1007 *

Причина, по которой вы делаете это вместо написания запроса для себя, заключается в том, что Drupal и его модули находятся вместе в качестве фреймворка. Большую часть времени вы захотите использовать эту платформу для того, чтобы делать то, что вы хотите, а не обходить ее стороной, чтобы написать собственный запрос. В будущем, если вы обновите Drupal или модуль node_load () все равно будет работать, но ваш код может не работать.

...