形成复杂的SQL语句

时间:2010-07-23 03:16:40

标签: mysql sql database join

我正忙着为我的一个项目构建一个有效的SQL语句。首先,我有一个“问题”表和一个“响应”表。响应表通过名为“question_id”的外来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 个答案:

答案 0 :(得分:3)

您正在寻找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 :(得分:1)

INNER JOIN将剔除任何非加入数据。改为使用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 

答案 2 :(得分:0)

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

答案 3 :(得分:0)

给它一个机会。我不知道tutor_id加入了什么,但我认为它是用户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(区别于用户你)。

编辑:我有点假设“导师”只是另一个回答问题的用户。