简体   繁体   English

比较/评估 mysql 中的两个子查询

[英]Compare / evaluate two subqueries in mysql

I would like to create a third select that will say pass if the score equals to maxscore, else will fail.我想创建第三个 select 如果分数等于 maxscore 则表示通过,否则将失败。 this are the queries to evaluate...这是要评估的查询...

How would I do this?我该怎么做? Can I create a third subquery AS Status, or do I need to create on variables??我可以创建第三个子查询 AS 状态,还是需要在变量上创建?

SELECT DISTINCT 
    qui.title AS Course_Name,   
    (SELECT sum(score) 
     FROM jos_jquarks_quizzes_answersessions     
     WHERE score IS NOT NULL 
       AND quizsession_id = quizSession.id     
       AND status <> -1 ) AS score, 
    (SELECT count(distinct question_id)  
     FROM jos_jquarks_quizzes_answersessions            
     WHERE quizsession_id = quizSession.id) AS maxScore,  
    (SELECT count(distinct question_id)  
     FROM jos_jquarks_quizzes_answersessions            
     WHERE quizsession_id = quizSession.id ) AS QuizStatus, 
    DATE_FORMAT(quizSession.finished_on,'%W, %M %e, %Y @ %h:%i %p') As Finished  
FROM 
    jos_jquarks_quizsession AS quizSession  
LEFT JOIN 
    jos_jquarks_users_quizzes AS users_quizzes ON users_quizzes.id = quizSession.affected_id    
LEFT JOIN 
    jos_jquarks_quizzes AS qui ON users_quizzes.quiz_id = qui.id     
LEFT JOIN 
    jos_jquarks_quizzes_answersessions AS quizSessAns ON quizSessAns.quizsession_id = quizSession.id 
LEFT JOIN 
    jos_jquarks_sessionwho AS sessionWho ON sessionWho.session_id = quizSession.id        
LEFT JOIN 
    jos_jquarks_users_profiles AS users_profiles ON users_profiles.user_id = sessionWho.user_id 
LEFT JOIN 
    jos_jquarks_profiles AS profiles ON profiles.id = users_profiles.profile_id   
WHERE 
    sessionWho.user_id = '246'

If you don't need to return the score or maxscore then you can simply compare the two subquery expressions:如果您不需要返回 score 或 maxscore,那么您可以简单地比较两个子查询表达式:

SELECT quizSession.id, IF(
    (SELECT sum(score)
       FROM jos_jquarks_quizzes_answersessions     
       WHERE score IS NOT NULL AND quizsession_id = quizSession.id AND status <> -1) =
    (SELECT count(distinct question_id)
       FROM jos_jquarks_quizzes_answersessions
       WHERE quizsession_id = quizSession.id), "Pass", "Fail") AS status
  FROM quizSession

If you do need all of the columns, you would probably be better off writing the subqueries as joins:如果您确实需要所有列,则最好将子查询编写为连接:

SELECT quizSession.id, sum_subquery.score_sum AS score, max_subquery.max_score,
       IF(sum_subquery.score_sum = max_subquery.max_score, "Pass", "Fail") AS status
  FROM quizSession
  INNER JOIN (
    SELECT quizsession_id, sum(score) AS score_sum
      FROM jos_jquarks_quizzes_answersessions     
      WHERE score IS NOT NULL AND status <> -1
      GROUP BY quizSession_id
  ) AS sum_subquery ON quizSession.id = sum_subquery.quizsession_id
  INNER JOIN (
    SELECT quizsession_id, count(distinct question_id)
      FROM jos_jquarks_quizzes_answersessions
      GROUP BY quizsession_id
  ) AS max_subquery ON quizSession.id = max_subquery.quizsession_id
SELECT * from   

(SELECT sum(score) 
 FROM jos_jquarks_quizzes_answersessions     

  WHERE score IS NOT NULL AND   quizsession_id = quizSession.id     
   AND status <> -1  
UNION
 SELECT count(distinct question_id)  FROM jos_jquarks_quizzes_answersessions            
WHERE quizsession_id = quizSession.id 
UNION 

 SELECT count(distinct question_id)  FROM jos_jquarks_quizzes_answersessions            
WHERE quizsession_id = quizSession.id ) AS marksscormaxxmarkstrigger

This works well这很好用

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM