Последняя нода из каждого термина

Вс, 09/05/2010 - 13:38

Здравствуйте.

Не сказал бы, что задача нераспространенная. Очень даже обычная. Нужно выбрать одну последнюю ноду (в моем случае картинку, прикрепленную к ней) для каждого термина из определенного словаря.

То есть результат должен быть таким:

Терм1 - Нода49
Терм2 - Нода23
Терм3 - Нода75

На дру.ру нашел только это: http://www.drupal.ru/node/42216
но там решения нет.

Вот запрос, который делает нужное:

SELECT maxn.term,
       n2.nid,
       f.filepath,
       n2.changed
FROM   (SELECT MAX(n1.changed) AS ch,
               tn.tid          AS term
        FROM   node n1
               JOIN term_node tn
                 ON tn.nid = n1.nid
               JOIN term_data td
                 ON tn.tid = td.tid
                    AND td.vid = 2
        GROUP  BY tn.tid
        ORDER  BY n1.changed DESC) maxn
       JOIN node n2
         ON maxn.ch = n2.changed
       JOIN content_field_article_preview cck
         ON n2.nid = cck.nid
       JOIN files f
         ON cck.field_article_preview_fid = f.fid
WHERE  n2.TYPE IN ( 'report', 'article', 'post' )
       AND cck.field_article_preview_fid IS NOT NULL  

Вопрос в следующем - это можно как-то улучшить? Все-таки опыта у меня сравнительно мало, хотел бы ознакомиться с мнением знающих людей.

Спасибо.

PS> Всех с праздником :)

0 Спасибо

Комментарии

Аватар пользователя Обухов Никита
7 лет 2 недели назад Обухов Никита #

Ну, вьюс это интерфейс для построения SQL-запроса путем тыканья в кнопки, ну и вывода результата.

Тут вьюс не поможет. Увы.

0 Спасибо
Аватар пользователя Обухов Никита
7 лет 2 недели назад Обухов Никита #

Мда. Поперли первые глюки. Если, к примеру, добавить новый материал типа 'report' без прикрепленной картинки, то его термин в общем списке вообще не выведется.

Кому надо, вот практически готовый сниппет с исправлениями:

 
 $node_types = array('report', 'article', 'post'); // Типы материалов, из которых идет выборка
  $sql = "
        SELECT maxn.term,
               n2.nid,
               maxn.image
        FROM   (SELECT MAX(n1.changed) AS ch,
                       td.name         AS term,
                       f.filepath      AS image
                FROM   node n1
                       JOIN term_node tn
                         ON tn.nid = n1.nid
                       JOIN term_data td
                         ON tn.tid = td.tid
                            AND td.vid = %d
                       JOIN content_field_article_preview cck
                         ON n1.nid = cck.nid
                       JOIN files f
                         ON cck.field_article_preview_fid = f.fid
                WHERE n1.type IN ("
. db_placeholders($node_types, 'text') . ")
                      AND cck.field_article_preview_fid IS NOT NULL
                      AND n1.status <> 0
                GROUP  BY tn.tid
                ORDER  BY td.name  ASC) maxn
               JOIN node n2
                 ON maxn.ch = n2.changed
  "
;
  $args = array_merge(array(2), $node_types); // 2 - ID словаря, откуда брать термины.
  $count = 0;
  $output = '';
  $query = db_query($sql, $args);
  while ($row = db_fetch_object($query)) {
    $output .= theme('ваша_функция_темизации', $row);
    $count++;
  }
0 Спасибо
Аватар пользователя Sinkora
7 лет 2 недели назад Sinkora #

Это получше, чем это - http://drupal.ru/node/42216 :)
А ты проверял через EXPLAIN? Как долго у тебя выполняется этот запрос?

Обухов Никита написал:
Мда. Поперли первые глюки. Если, к примеру, добавить новый материал типа 'report' без прикрепленной картинки, то его термин в общем списке вообще не выведется.

Тут, как я понимаю, дело в "JOIN content_field_article_preview cck". Попробуй заменить на "LEFT JOIN content_field_article_preview cck". Т.е. сейчас делает выборку тех узлов, у которых есть поле content_field_article_preview. А нужно, чтобы при отсутствии поля content_field_article_preview узел все равно загружался ("LEFT JOIN" должен это решить).

0 Спасибо
Аватар пользователя Dan
7 лет 2 недели назад Dan #
Обухов Никита написал:
Ну, вьюс это интерфейс для построения SQL-запроса путем тыканья в кнопки, ну и вывода результата.
Тут вьюс не поможет. Увы.

Как ты свысока о views-то :) У тебя не лучше views: все таблицы, в которых есть vid, надо присоединять по нему,а не по nid. Ревизии может пока и не используешь. Но это _сейчас_. К тому же все привычки должны быть правильные :)

0 Спасибо
Аватар пользователя Обухов Никита
7 лет 2 недели назад Обухов Никита #
Sinkora написал:
Попробуй заменить на "LEFT JOIN content_field_article_preview cck"

Да, все верно. СПС.

Dan написал:
Как ты свысока о views-то :)

Коряво выразился, сам регулярно пользуюсь - прекрасный модуль. Но пока, увы, многих вещей не позволяет.

0 Спасибо