Подскажите как оптимальнее или правильнее что ли.
Допустим делаю выборку:
<?php
$result = db_query_range("
SELECT n.title, n.nid, nc.nid, nc.totalcount, cts.nid, cts.field_image_fid, f.fid, f.filepath
FROM {node} n
INNER JOIN {node_counter} nc ON n.nid = nc.nid
INNER JOIN {content_type_story} cts ON nc.nid = cts.nid
INNER JOIN {files} f ON cts.field_image_fid = f.fid
WHERE n.status = 1
ORDER BY nc.totalcount
DESC ", 0, 20);
while ($node = db_fetch_object($result)) {
print ".......";
}
?>
Или лучше запрос уменьшить и загрузить ноду:
<?php
$result = db_query_range("SELECT n.nid, nc.nid, nc.totalcount
FROM node n, node_counter nc
WHERE n.status = 1 and n.nid = nc.nid
ORDER BY nc.totalcount
DESC ", 0, 20);
while ($node = db_fetch_object($result)) {
$content = node_load($node->nid);
print ".......";
}
?>
Комментарии
быстрее (в большинстве случаев) будет работать первый вариант.
А как "правильнее" зависит от того что вы подразумеваете под "правильнее" - если это обычный клиентский сайт то лучше делать через views такое, если хайлоад проект с ограниченным бюджетом на железо то можно и так как в 1 варианте.
Сайты свои, views устанавливать ради одной выборки смысла нет, посещаемость средняя у проектов до 10 тыс. посетителей в сутки.
Спасибо, буду с базы дергать значит. Просто думал node_load базу разгрузит.
node_load это обертка над entity_load то есть по сути это DrupalEntityControllerInterface::load, и базу он не разгрузит скорее наоборот из-за накладных расходов.
node_load конечно в цикле не надо делать.
сделай explane запроса, или тупо замерь время.
тут и мерить нечего, 1й запрос далеко не тяжелый, и в данном случае, разница в запросах к БД будет не велика, а вот от кучи node_load увеличится время на PHP обработку, при том довольно сильно(200-300 node_load на слабом железе могут занимать уже секунды).