【问题标题】:Select rows and display as columns from mySQL database从 mySQL 数据库中选择行并显示为列
【发布时间】:2012-07-23 19:43:02
【问题描述】:

所有, 我有以下 mySQL 表结构:

表 dj_feedback_answers: answer_id, gig_id, question_id, answer_id 表 dj_feedback_summary:summary_id、user_id、gig_date、tip、summary、why_poor、why_fair 表 dj_feedback_questions:question_id、question_value、question_display 表 dj_feedback_ratings:rating_id、rating_value、rating_display

我基本上是在向用户提问,这些问题存储在 dj_feedback_questions 表中,并允许他们对每个问题进行评分。评分存储在 dj_feedback_ratings 中。

每个表单都可以有不同的问题,因此当我提交问题时,我会将答案存储在 dj_feedback_answers 中。表单上还有其他更多静态字段,这些字段被放入 dj_feedback_summary。 summary_id 和 gig_id 是连接两个表以获取用户提交的答案的键。

这意味着对于 dj_feedback_summary 表中的单行,dj_feedback_answers 中可以有多行。

我想做的基本上是能够利用 PHP 表中的结果。所以我希望我的结果看起来像这样(假设 dj_feedback_questions 表中有三个问题):

summary_id、user_id、gig_date、小费、总结、why_poor、why_fair、question_1、question_2、question_3 1, 2, 07/23/2012, 5, 这是一个总结, 很差, 很公平, 3, 4, 5

为问题存储的值将是来自 dj_feedback_answers 的 answer_id。

我尝试创建以下查询来获取我的结果。这工作正常,但它只能显示一个问题而不是所有问题。

Select dj_feedback_summary.summary_id, 
       dj_feedback_summary.user_id, 
       dj_feedback_summary.gig_date, 
       dj_feedback_summary.tip, 
       dj_feedback_summary.summary,  
       dj_feedback_answers.question_id, 
       dj_feedback_answers.rating_id, 
       dj_feedback_questions.question_value, 
       users.first_name, users.last_name, 
       dj_feedback_ratings.rating_value
from dj_feedback_summary
join dj_feedback_answers on dj_feedback_summary.summary_id=dj_feedback_answers.gig_id
join dj_feedback_questions on dj_feedback_answers.question_id=dj_feedback_questions.question_id 
join users on dj_feedback_summary.user_id=users.user_id
join dj_feedback_ratings on dj_feedback_ratings.rating_id=dj_feedback_answers.rating_id
where dj_feedback_questions.question_value='Overall Gig'
order by dj_feedback_summary.summary_id DESC

有没有办法修改我的查询,以便它可以返回我想要的结果?

非常感谢任何建议!

谢谢

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    如果您需要显示来自多行的值,并且不必将它们放在单独的列中,那么 MySQL GROUP CONCAT function 可能适合您的目的。

    这会给你question_1question_2question_3 值串联成一个列(如果我正确理解你的输出意图)。

    更新:要进行更“真实”的数据透视(将不同问题的答案分成不同的列),您可以使用以下方法之一:

    1) 使用多个表别名: 每个问题加入dj_feedback_questions 表一次,例如大致如下:

    SELECT [...] FROM [...]
    LEFT JOIN dj_feedback_questions q1 on q1.question_id = 1
    LEFT JOIN dj_feedback_questions q2 on q2.question_id = 2
    LEFT JOIN dj_feedback_questions q3 on q2.question_id = 3
    

    然后您需要 a) 以类似方式加入 dj_feedback_answers(多次使用别名),因为您通过 question_id 访问它,并且您希望将不同的问题分成不同的列,并且 b) 汇总结果并决定如何处理空值,因为执行常规 JOIN 而不是 LEFT JOIN 会导致您丢失任何缺少一个或多个问题答案的摘要行。

    2) 使用 IF 块分成列:请参阅此 SO 问题(特别是已接受的答案)以获取说明:Transpose mysql query rows into columns

    【讨论】:

    • 谢谢,但我的输出意图是为答案表中的每一行提供一个输出列。
    • 谢谢,我会调查的。如果我不知道有多少问题(因为它是可变的),有没有办法让查询说为可变数量的问题左连接?
    猜你喜欢
    • 2019-12-04
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    相关资源
    最近更新 更多