Drupal создает представления, включающие LEFT JOIN Sub-Select с несуществующим узлом - PullRequest
0 голосов
/ 15 июня 2011

Я использую Drupal 6 У меня есть это табличное отношение, и я перевел на CCK вместе с его отношением. В основном, когда я просматриваю узел Периода, у меня есть вкладки для отображения ВСЕХ узлов факультета в сочетании с номером присутствия.

вот схема таблицы: http://i.stack.imgur.com/7Y5cU.png Переведено в CCK примерно так: ЧКК факультет (имя), CCK Period (desc, from, to) и CCK Присутствие (node-reference-faculty, node-reference-period ,sence_number)

Вот мой простой ручной SQL-запрос, который достигает этого результата: http://i.stack.imgur.com/oysd3.png

SELECT faculty.name, presence.presence_number FROM Faculty AS faculty
LEFT JOIN (SELECT * FROM Presence WHERE Period_id=1) AS presence ON faculty.id=presence.Faculty_id

Значение 1 для Period_id будет определяться идентификатором узла периода из аргумента url.

Теперь самая сложная часть - это симуляция простого SQL-запроса выше в Views. Как я могу сделать такой запрос в Views в Drupal-6 или Drupal-7?

спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 04 июня 2015

Я написал статью о том, как добиться подобного результата здесь. http://scottanderson.com.au/#joining-a-views-query-to-a-derived-table-or-subquery

В основном, как изменить запрос Views на левое соединение подзапроса.

0 голосов
/ 17 июня 2011

Основная проблема, которую, я думаю, вы заметили, заключается в том, что если вы рассматриваете факультет как основу для своего соединения, то нет никакого способа присоединиться к узлам присутствия. И наоборот, если вы будете рассматривать Присутствие как основу, то вы не увидите способностей, у которых нет номера присутствия.

Нет простого способа, используя вашу текущую структуру, чтобы сделать эти объединения в представлениях. Я бы сказал, что ваш самый простой вариант - удалить поле «node-reference-faculty» из узла присутствия и добавить поле «node-reference-faculation» для факультета. Поскольку поля CCK могут иметь несколько значений, у вас все равно может быть правильное отношение «один ко многим».

Единственным недостатком этого является то, что тогда вам нужно управлять отношениями присутствия и способности из узлов факультета вместо узлов присутствия. Если это ограничитель показа, который может зависеть от вашего рабочего процесса, вы можете использовать ОБА поля для ссылки на узел и использовать такой модуль, как http://drupal.org/project/backreference, чтобы синхронизировать их.

Как только у вас появится рекомендация от факультета -> присутствие, вам нужно будет добавить связь в Views. Точно так же, как добавление поля или фильтра, откройте список отношений и найдите его для своего поля ссылки на узел.

Далее вам нужно будет добавить аргумент для идентификатора периода и настроить его на использование идентификатора узла из URL. Ключевым моментом является то, что когда вы добавляете аргумент, он спрашивает, какое отношение использовать в его параметрах. Вы захотите сказать ему, чтобы использовать только что добавленные отношения присутствия.

Вам не нужно делать подзапрос в вашем SQL таким образом. Это должно быть то же самое, и MySQL не будет пытаться создать временную таблицу. Я упоминаю об этом, потому что вы действительно не можете делать подзапросы в Views, если вы не пишете очень специальный обработчик Views, но в этом случае вам не нужен подзапрос в любом случае.

Ex.

SELECT f.name, p.presence_number
FROM Faculty AS f
LEFT JOIN Presence AS p ON f.id=p.Faculty_id
WHERE p.Period_id=1;
...