Формирование сложного оператора SQL - PullRequest
1 голос
/ 23 июля 2010

Я зашел в тупик при формировании рабочего оператора SQL для моего проекта. Прежде всего, у меня есть таблица «вопросов» и таблица «ответов». Таблица ответов связана с таблицей вопросов через внешний идентификатор с именем «question_id» (связанный с «id» вопросов). Вопрос не обязательно должен иметь ответ, но единственное рабочее утверждение, которое я могу придумать, будет содержать только вопрос с ответом, но мне нужно, чтобы он отображал каждый вопрос, есть ли ответ.

Этот оператор SQL:

SELECT u.firstname, q.question, r.tutor_id, r.response FROM response r 
JOIN question q ON q.id = r.question_id
JOIN user u ON u.id = q.user_id

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

Работает с:

SELECT u.firstname, q.question, v.firstname, r.response
FROM question q
INNER JOIN user u ON u.id = q.user_di
LEFT JOIN response r ON q.id = r.question_id
LEFT JOIN user v ON v.id = r.tutor_id

Ответы [ 4 ]

3 голосов
/ 23 июля 2010

Вы ищете LEFT JOIN вместо внутреннего соединения. Это вернет все значения в первой таблице независимо от того, соответствует ли оно одному из второй таблицы.

Что касается второго вопроса, похоже, вам нужна таблица преподавателя, чтобы присоединиться, чтобы получить имя. Один существует?

SELECT u.firstname, q.question, r.tutor_id, r.response, u2.firstname AS TutorName FROM response r 
LEFT JOIN question q ON q.id = r.question_id
JOIN user u ON u.id = q.user_id
JOIN user u2 on u2.id = r.tutor_id
1 голос
/ 23 июля 2010

ВНУТРЕННЕЕ СОЕДИНЕНИЕ отбраковывает любые не присоединяющиеся данные.Вместо этого используйте LEFT JOIN, и вы получите все строки с левой стороны.

SELECT 
    u.firstname, 
    q.question, 
    r.tutor_id, 
    r.response 
FROM 
    question q          // left hand side

    INNER JOIN user u       // assumes all questions have a user
    ON u.id = q.user_id

    LEFT JOIN  response r 
    ON q.id = r.question_id 

Где хранится имя репетитора?

ОК, я неконечно, почему некоторые другие решения не работают для вас, но вы всегда можете сделать что-то вроде этого, включив имя преподавателя:

SELECT 
        u.firstname, 
        q.question, 
        T.tutor_id,
        T.firstname, 
        T.response 
    FROM 
        question q          // left hand side

        INNER JOIN user u       // assumes all questions have a user
        ON u.id = q.user_id

        LEFT JOIN (
                SELECT
                    r.response,        
                    r.question_id,
                    r.tutor_id
                    u2.firstname
                FROM
                    response r 

                    INNER JOIN user u2
                    ON r.tutor_id = u2.id   // Is there a user type we can also join on?
            ) T 
        ON q.id = T.question_id 
0 голосов
/ 23 июля 2010

Дайте этому шанс. Я не знаю, к чему присоединен tutor_id, но я предполагаю, что это идентификатор пользователя?

SELECT u.firstname, q.question, v.firstname, r.response FROM question q
LEFT JOIN q ON q.id = r.question_id
LEFT JOIN user u ON u.id = q.user_id
LEFT JOIN user v ON v.id = r.tutor_id

Смотри, что я схватил имя пользователя, который ответил (я думаю). Я сделал это v (отличая его от пользователя u).

РЕДАКТИРОВАТЬ: Я как бы предполагаю, что "репетитор" - это просто еще один пользователь, который отвечает на вопрос.

0 голосов
/ 23 июля 2010
SELECT u.firstname, q.question, r.tutor_id, r.firstname as tutorname, r.response FROM 
response r RIGHT JOIN (question q INNER JOIN user u ON u.id = q.user_id)
ON q.id = r.question_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...