Пользовательский SQL: соединения nodereference и последняя версия VID


У меня чертовски много времени на создание пользовательского SQL-запроса. Запрос содержит несколько ссылок на узлы и должен возвращать последнюю версию узла. Я довольно хорошо понимаю joins, но по какой-то причине дополнительная сложность возврата последней версии сбивает меня с толку.

Я бы предпочел пойти по этому пути, а не создавать представления и выполнять их программно, просто из-за сложности предложений WHERE.

Я пробовал переводить вывод эквивалентного представления, но приставка, к которой прикрепляются представления, делает понимание этого огромной задачей. Мой инстинкт подсказывает, что для этого тоже не нужно так много соединений.

Хотелось бы увидеть общую структуру, с которой люди могли бы начать, или, ради беседы, вот сильно упрощенная версия того, с чем я работаю. Эта версия немного меняется, я думаю, что у меня есть последняя версия, но теперь person1Name, person2Name не возвращаются что-нибудь.

SELECT event.nid AS eventnid,
       event.field_event_date_value AS date,

       event.field_event_person1_nid AS person1Nid,
       person1.field_person_name_value AS person1Name,

       event.field_event_person2_nid AS person2Nid,
       person2.field_person_name_value AS person2Name,
FROM {node} n

LEFT JOIN {content_type_event} event
    ON n.vid = event.vid        

LEFT JOIN {node} refevent
    ON event.vid = refevent.nid

LEFT JOIN {content_type_person} person1
    ON refevent.vid = person1.nid

LEFT JOIN {content_type_person} person2
    ON refevent.vid = person2.nid
Author: kiamlaluno, 2011-03-04

1 answers

LEFT JOIN {node} refevent
    ON event.vid = refevent.nid

LEFT JOIN {content_type_person} person1
    ON refevent.vid = person1.nid

LEFT JOIN {content_type_person} person2
    ON refevent.vid = person2.nid

Это выглядит неправильно. Вместо этого вы, вероятно, захотите использовать event.field_event_person1_nid и 2 вместо refevent.vid. Дополнительное соединение узла не должно быть необходимым, у вас уже есть узел в качестве основной таблицы.

Запрос все еще возвращает что-то, потому что вы используете ЛЕВОЕ СОЕДИНЕНИЕ. Поскольку я предполагаю, что эти поля обязательны и/или вам нужны только те, которые заполнены, вам следует просто использовать JOIN. СОЕДИНЕНИЕ СЛЕВА означает, что основная таблица возвращается, даже если совпадения нет строка в объединенной таблице.

То же самое верно и для таблицы content_type_event. Нет необходимости в ЛЕВОМ СОЕДИНЕНИИ. Это именно то, что делает views по умолчанию, если вы не укажете, что связь обязательна.

 0
Author: Berdir, 2011-03-04 20:02:51