1

I want to pull only the quizzes where the maxscore = score in the below query, can you please tell me what is wrong on the syntax?

$database->setQuery('SELECT distinct qui.title AS name,' .
        ' ( SELECT GROUP_CONCAT(profiles.title) 
              FROM #__jquarks_users_profiles AS users_profiles
              LEFT JOIN #__jquarks_profiles AS profiles ON users_profiles.profile_id = profiles.id
              WHERE users_profiles.user_id = sessionWho.user_id ) AS profile, ' .
        ' ( SELECT sum(score)  
              FROM #__jquarks_quizzes_answersessions
              WHERE quizsession_id = quizSession.id
              AND status <> -1 ) AS score,' .
        ' ( SELECT count(distinct(question_id))
              FROM #__jquarks_quizzes_answersessions 
              WHERE quizsession_id = quizSession.id ) AS maxScore,' .

            ' ( SELECT count(id)
              FROM #__jquarks_quizzes_answersessions 
              WHERE status=-1
              AND quizsession_id = quizSession.id ) AS evaluate,' .
' quizSession.finished_on,sessionWho.email' .     
        ' FROM #__jquarks_quizsession AS quizSession' .
        ' LEFT JOIN #__jquarks_users_quizzes AS users_quizzes ON users_quizzes.id = quizSession.affected_id' .
        ' LEFT JOIN #__jquarks_quizzes AS qui ON users_quizzes.quiz_id = qui.id' .
        ' LEFT JOIN #__jquarks_quizzes_answersessions AS quizSessAns ON quizSessAns.quizsession_id = quizSession.id' .
        ' LEFT JOIN #__jquarks_sessionwho AS sessionWho ON sessionWho.session_id = quizSession.id' .
        ' LEFT JOIN #__jquarks_users_profiles AS users_profiles ON users_profiles.user_id = sessionWho.user_id' .
' LEFT JOIN #__jquarks_profiles AS profiles ON profiles.id = users_profiles.profile_id '.

' WHERE sessionWho.user_id =' .$id  AND score = maxScore) ;
2
  • so there is a syntax problem not a SQL query itself? Commented Aug 12, 2011 at 23:47
  • can you go straight to phpmyadmin and check the sub-queries one by one? Commented Aug 13, 2011 at 15:17

2 Answers 2

2

The last part, AND score = maxScore is not put in quotes. This should also be part of your SQL string.

You can easily see this even in the highlighting that is applied to the code in your question, but certainly the highlighter of your editor should reveil it too. Do you use an editor like NetBeans or even Notepad++?

$database->setQuery('SELECT distinct qui.title AS name,' .
        ' ( SELECT GROUP_CONCAT(profiles.title) 
              FROM #__jquarks_users_profiles AS users_profiles
              LEFT JOIN #__jquarks_profiles AS profiles ON users_profiles.profile_id = profiles.id
              WHERE users_profiles.user_id = sessionWho.user_id ) AS profile, ' .
        ' ( SELECT sum(score)  
              FROM #__jquarks_quizzes_answersessions
              WHERE quizsession_id = quizSession.id
              AND status <> -1 ) AS score,' .
        ' ( SELECT count(distinct(question_id))
              FROM #__jquarks_quizzes_answersessions 
              WHERE quizsession_id = quizSession.id ) AS maxScore,' .

            ' ( SELECT count(id)
              FROM #__jquarks_quizzes_answersessions 
              WHERE status=-1
              AND quizsession_id = quizSession.id ) AS evaluate,' .
' quizSession.finished_on,sessionWho.email' .     
        ' FROM #__jquarks_quizsession AS quizSession' .
        ' LEFT JOIN #__jquarks_users_quizzes AS users_quizzes ON users_quizzes.id = quizSession.affected_id' .
        ' LEFT JOIN #__jquarks_quizzes AS qui ON users_quizzes.quiz_id = qui.id' .
        ' LEFT JOIN #__jquarks_quizzes_answersessions AS quizSessAns ON quizSessAns.quizsession_id = quizSession.id' .
        ' LEFT JOIN #__jquarks_sessionwho AS sessionWho ON sessionWho.session_id = quizSession.id' .
        ' LEFT JOIN #__jquarks_users_profiles AS users_profiles ON users_profiles.user_id = sessionWho.user_id' .
' LEFT JOIN #__jquarks_profiles AS profiles ON profiles.id = users_profiles.profile_id '.

' WHERE sessionWho.user_id =' .$id . ' AND score = maxScore') ;

PS: Do your table names actually contain a #? Maybe you should use back-quotes around those table names then, like:

LEFT JOIN `#__jquarks_users_profiles`
Sign up to request clarification or add additional context in comments.

5 Comments

thanks for your help GolezTrol, would kindly help, now i get and error stating:Warning: Invalid argument supplied for foreach()
code that outputs the query: echo '<table style="' . $tableStyle . '" cellpadding="7" cellspacing="7">'; echo "<tr> <th> Quiz Title </th><th> Score </th><th>Maximum Score </th><th> Unanswered </th> <th>Finished On </th></tr>"; $row = $database->loadRowList(); foreach($row as $valuearray) { echo '<tr style=" align="center">'; foreach($valuearray as $field) { echo "<td>$field</td>"; } echo "</tr>"; } echo "</table>"; ?>
score and maxScore are not fields but evaluated columns. they can't be put in WHERE clause.
so what can i do instead, I only need to render the score which is equal to the max score from all the scores, how can change the code to do this , meabe a variable?
@TonyR, that feels like a new question. Maybe you should post it as such, instead of pasting that code in a comment which renders it completely unreadable.
1
$database->setQuery(
    "SELECT *
     FROM
     ( SELECT distinct qui.title AS name,
          ( SELECT GROUP_CONCAT(profiles.title) 
              FROM #__jquarks_users_profiles AS users_profiles
              LEFT JOIN #__jquarks_profiles AS profiles ON users_profiles.profile_id = profiles.id
              WHERE users_profiles.user_id = sessionWho.user_id ) AS profile, 
          ( SELECT sum(score)  
              FROM #__jquarks_quizzes_answersessions
              WHERE quizsession_id = quizSession.id
              AND status <> -1 ) AS score,
          ( SELECT count(distinct question_id)
              FROM #__jquarks_quizzes_answersessions 
              WHERE quizsession_id = quizSession.id ) AS maxScore,   
          ( SELECT count(id)
              FROM #__jquarks_quizzes_answersessions 
              WHERE status=-1
              AND quizsession_id = quizSession.id ) AS evaluate,
          quizSession.finished_on, 
          sessionWho.email     
       FROM #__jquarks_quizsession AS quizSession
         LEFT JOIN #__jquarks_users_quizzes AS users_quizzes ON users_quizzes.id = quizSession.affected_id
         LEFT JOIN #__jquarks_quizzes AS qui ON users_quizzes.quiz_id = qui.id
         LEFT JOIN #__jquarks_quizzes_answersessions AS quizSessAns ON quizSessAns.quizsession_id = quizSession.id
         LEFT JOIN #__jquarks_sessionwho AS sessionWho ON sessionWho.session_id = quizSession.id
         LEFT JOIN #__jquarks_users_profiles AS users_profiles ON users_profiles.user_id = sessionWho.user_id
         LEFT JOIN #__jquarks_profiles AS profiles ON profiles.id = users_profiles.profile_id 
       WHERE sessionWho.user_id = " . $id . 
    ")
     WHERE score = maxScore" ) ;

2 Comments

hi thanks for your output,, i receive again.. Warning: Invalid argument supplied for foreach()
@TonyR: Have you tried the query in PHPMyAdmin (to be sure that it at least that is OK)? If the query is fine, then the problem is probably in your PHP code. But you haven't posted that. Edit your question and add the PHP code. I see no foreach() in the code you have posted.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.