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".

Надеюсь, что это поможет