Как написать запрос для выполнения двух разных выборок из одной таблицы - PullRequest
0 голосов
/ 13 октября 2019

Я работаю над таблицей, которая похожа на переполнение стека. Здесь хранятся вопросы, ответы и комментарии.

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

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

Я хочу использовать этот запрос в spring-data-jpa. Сначала я попытался сделать это с помощью jpa, но это не работает. Я думаю, что этот запрос более сложен, чтобы создать его напрямую с помощью spring-data-jpa.

Это важные поля моей таблицы в MySQL:

id | content_id | content_type_id | subject | body | tags | user_id | dtype

content_id использует для ответов икомментарии и показывает идентификатор вопроса, к которому принадлежит ответ или комментарий. dtype указывает тип записи, в которой есть одно из значений вопросов, ответов или комментариев.

это запросы, которые я пытался выполнить:

select distinct T1.`content_id`,
(Select `body`,`dtype` from content As T3 where T3.content_id = 19 and 
T3.content_type_id = 2),
(Select `body`,`dtype` from content As T4 where T4.content_type_id = 3 and 
T4.content_id = T3.id)
from content as T1

SELECT a.body, a.user_id, a.dtype, c.body, c.user_id, c.dtype FROM content a
JOIN content c ON a.id = c.content_id WHERE a.content_id = 19

это метод, который я пытался использовать вspring boot

public Question getQuestionAnswerAndComment(Question question){
    List<List> result = new ArrayList<>();
    Optional<Question> ques = getQuestion(question); // getting one question by id

    result.add(questionRepository.findByContentTypeIdAndContentId(3, question.getId()));  //getting comments of the question (3 means comment)
    Answer ans = questionRepository.findByContentTypeIdAndContentIdAnswer(2, question.getId()); // getting answers of the question (2 measn answer)
}

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

Теперь, что я должен сделать, чтобы получить желаемые данные из базы данных, я должен использовать методы spring-data-jpa или создать собственный запрос и затем вызвать его.

Желаемый результат:

Вопрос

---- Комментарии к вопросу

Первый ответ на вопрос

---- Комментарии к первому ответу

Второйответ на вопрос

---- Комментарии ко второму ответу

1 Ответ

0 голосов
/ 14 октября 2019

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

select * from content as questions
    left join content as comment_or_answer
        on questions.id = comment_or_answer.content_id
    left join content as answer_comments
        on comment_or_answer.id = answer_comments.content_id
where questions.content_type_id = <question-type-id>
    and <add constraints on the question here, e.g. on the id>
order by questions.id, comment_or_answer.content_type_id, comment_or_answer.id

Это дает вам тройное объединение таблицы с вопросамив первом наборе столбцов комментарий и ответы во втором наборе столбцов и комментарии к ответам в третьем наборе столбцов.

Затем я выполняю этот запрос, используя NamedParameterJdbcTemplate, и использую ResultSetExtractorпостроить из него объект результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...