Drupal: MySQL SELECT всех сообщений, относящихся к определенному форуму
Мне нужно выбрать все сообщения (первые сообщения и ответы), размещенные в массиве определенных категорий (форумов) в Drupal.
Первые сообщения хранятся в field_data_body
, ответы хранятся в field_data_comment_body
.
Структура field_data_body
и field_data_comment_body
одинакова, в столбце body_value
есть содержимое сообщений и в столбце entity_id
их уникальный идентификатор.
В таблице field_data_taxonomy_forums
содержится столбец entity_id
и столбец taxonomy_forums_tid
(которые являются идентификаторами категорий форума). Таблица taxonomy_term_data
содержит столбцы tid
(что совпадает с столбцом taxonomy_forums_tid
и description
(который является названием категории форума).
Итак, я ищу запрос, который позволяет мне выбирать тело сообщений (как первые сообщения, так и ответы), так и описание форума, определяющего массив tid
(то есть идентификаторы категорий форума), который я вручную найду в таблице taxonomy_term_data
.
Итак, например, я ищу запрос, который позволяет мне выбирать сообщения "принадлежность" к tid
1456,7622,862
и относительное описание tid
.
Вот скриншот таблицы field_data_body
:
![enter image description here]()
Ответы
Ответ 1
Думаю, нам было бы лучше разбить задачу на две подзадачи:
- Найдите тела сообщений, принадлежащих определенному тиду.
- Найдите все комментарии тела, относящиеся к определенному тиду.
Нам нужно будет использовать эти таблицы:
- field_data_taxonomy_forums
- field_data_body
- Комментарий
- field_data_comment_body
Структура базы данных:
![Database structure]()
Поиск тел
SELECT
taxonomy_forums.taxonomy_forums_tid AS tid,
body.entity_id,
body.body_value AS body
FROM
field_data_taxonomy_forums AS taxonomy_forums
INNER JOIN
field_data_body AS body
ON
body.entity_id=taxonomy_forums.entity_id
WHERE
taxonomy_forums.taxonomy_forums_tid IN (9);
Поиск комментариев для тел
Здесь нам понадобится таблица комментариев, которая объединяет field_data_body
и field_data_comment_body
.
SELECT
taxonomy_forums.taxonomy_forums_tid AS tid,
comment_body.entity_id,
comment_body.comment_body_value AS body
FROM
field_data_taxonomy_forums AS taxonomy_forums
INNER JOIN
field_data_body AS body
ON
body.entity_id=taxonomy_forums.entity_id
INNER JOIN
comment
ON
comment.nid=body.entity_id
INNER JOIN
field_data_comment_body AS comment_body
ON
comment_body.entity_id=comment.cid
WHERE
taxonomy_forums.taxonomy_forums_tid IN (9);
Если вы выполните UNION эти 2 запроса, вы получите список сообщений и комментариев.
sqlfiddle
Ответ 2
Чтобы найти ссылку на идентификатор форума, вы должны добавить использование таблицы "forum" (таблица, устанавливающая связь узлов с условиями форума).
Также следует отметить, что идентификатор форума не существует, это идентификатор таксономии.
Вот пример, чтобы получить только первую тему сообщения по таксономии id (tid)
SELECT * FROM field_data_body fdb
LEFT JOIN forum f ON f.nid = fdb.entity_id
WHERE fdb.bundle="forum" AND f.tid=15
Обратите внимание, что модуль форума работает с основным модулем комментария, означающим, что в поле "field_data_body" хранится только первое сообщение темы, и все ответы хранятся в таблице "field_data_comment_body".
Надеюсь, что это поможет