根据响应文本从两个表中获取上个月和当前月份数据

时间:2016-06-06 08:05:12

标签: mysql sql join

我希望获得QuestionText所有被标记为yes的问题在上个月但在当月没有。

我有两个表 QuestionMaster

QuestionID | QuestionText

其他表格为 ResponsesMaster

ResponseID | ResponseText | QuestionID | ResponseDateTime

响应日期时间在VARCHAR

以下查询返回所有响应。我想如上所述。

SELECT QM.QuestionText, AR.AssessmentID, AR.ResponseText 
FROM QuestionMaster QM, ResponsesMaster AR 
WHERE AR.QuestionID = QM.QuestionID  

3 个答案:

答案 0 :(得分:1)

SELECT QM.QuestionText,AR.AssessmentID,AR.ResponseText 来自QuestionMaster QM,ResponsesMaster AR 其中AR.QuestionID = QM.QuestionID和月(AR.ResponseDateTime)= MONTH(CURDATE())和QR.QuestionText ='是'和 QR.QuestionID in(SELECT QM.QuestionID 来自QuestionMaster QM,ResponsesMaster AR WHERE AR.QuestionID = QM.QuestionID和Month(AR.ResponseDateTime)= MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH))和QR.QuestionText =' No')

答案 1 :(得分:0)

试试这个。让我知道它是如何工作的。

select qm.QuestionID,qm.QuestionText
from QuestionMaster qm
inner join ResponsesMaster rm on qm.QuestionID = rm.QuestionID and rm.ResponseText = 'N' and month(rm.ResponseDateTime) = month(curdate)
inner join ResponsesMaster rm1 on rm.QuestionID = rm1.QuestionID and rm1.ResponseText = 'Y' and month(rm1.ResponseDateTime) = month(last_day(curdate()) - interval 1 month);

答案 2 :(得分:0)

首先,使用MySQL @变量,它们就像内联编程一样工作。我开始建造当月的第一天是例如:yyyy-mm-01。然后,返回一个月前的第一个月,并转到下个月的第一个月。如果您只使用当前日期,例如NOW 2016-06-06 @ 8:52 am,那么您的上个月是从5月06日上午8:52开始,但我认为您的确是指日历月与文字月份。

现在,我可以将这些变量用于范围标准> = FirstOfLastMonth AND< FirstOfThisMonth将考虑截至本月第一天之前一个月的最后一天晚上11:59:59的所有日期/时间。同样,向前,直到本月最后一天的晚上11:59:59。比如,如果你想比较历史数据,并希望在月初推出像2016-02-01'

现在获取您的数据。使用明确标记为'是'的那些记录开始FIRST。您正在寻找您正在寻找问题文本。如果多次输入,例如不同的人参加测试并且您有多个条目,该怎么办?我只是得到DISTINCT问题ID及其相应的文本。没有任何意义,因为你现在明确地寻找那些回答=' no'他们开始的地方是“是”'

SELECT DISTINCT
      QM.QuestionID,
      QM.QuestionText
   from
      ( select @FirstOfThisMonth := CONCAT( year(curdate()), '-', month( curdate()), '-01' ),
               @FirstOfLastMonth := date_add( @FirstOfThisMonth, interval -1 month ),
               @FirstOfNextMonth := date_add( @FirstOfThisMonth, interval +1 month ) ) sqlvars,
      ResponsesMaster RM
         JOIN QuestionMaster QM
            ON RM.QuestionID = QM.QuestionID

         JOIN ResponsesMaster RMNow
            ON RM.QuestionID = RMNow.QuestionID
            AND RMNow.ResponseText = 'no'
            AND RMNow.ResponseDateTime >= @FirstOfThisMonth
            AND RMNow.ResponseDateTime < @FirstOfNextMonth
   where
          RM.ResponseText = 'yes'
      AND RM.ResponseDateTime >= @FirstOfLastMonth
      AND RM.ResponseDateTime < @FirstOfThisMonth