【问题标题】:Forming a complex SQL statement形成复杂的 SQL 语句
【发布时间】:2010-07-23 03:16:39
【问题描述】:

我在为我的一个项目构建一个有效的 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

【问题讨论】:

    标签: mysql sql database join


    【解决方案1】:

    您正在寻找 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
    

    【讨论】:

    • 不,我只有一个用户表,其中包含区分基本用户和导师的“用户类型”。
    • Tutor_Id 是用户表中的值吗?用户表可能包含导师和调查参与者的姓名。这只是一个猜测!
    • tutor_id 是将响应表链接到用户表的外键。基本上,基本用户可以创建一个问题,一个响应链接到该问题,一个导师链接到该响应。
    • 查看我的编辑。您需要在 users 表上进行第二次连接(这次是 u2 的别名)来检索导师的姓名。
    • 完美地提取了导师的名字,但仍然只显示有回复的问题,而不是两者都有。非常感谢您的帮助!
    【解决方案2】:

    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 
    

    【讨论】:

    • 基本用户和导师都存储在用户表中,并以“用户类型”区分。一个基本用户创建一个问题,一个响应与该问题相关联,一个导师(用户)与该响应相关联。
    【解决方案3】:
    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
    

    【讨论】:

    • 另一个难题!但是,即使没有回复,它也会为每个问题显示相同的导师姓名:(
    【解决方案4】:

    试一试。我不知道加入了哪个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(将它与用户 u 区分开来)。

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

    【讨论】:

    • 啊,拉了导师的名字,但只显示问题和回答,而不是两者
    • 已经很晚了,所以我可能搞砸了;o)。基本上,我将答案改为 FROM question 而不是 FROM response。这样我们就在寻找问题,而不是回应。给我一些让我回去再看看你的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    相关资源
    最近更新 更多