【问题标题】:mysql query syntax errormysql查询语法错误
【发布时间】:2011-08-12 23:46:04
【问题描述】:

我只想提取以下查询中 maxscore = score 的测验,你能告诉我语法有什么问题吗?

$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) ;

【问题讨论】:

  • 所以存在语法问题而不是 SQL 查询本身?
  • 能不能直接去phpmyadmin里面对子查询一一查看?

标签: php mysql sql joomla


【解决方案1】:

最后一部分,AND score = maxScore 没有放在引号中。这也应该是您的 SQL 字符串的一部分。

即使在应用于问题代码的突出显示中,您也可以轻松看到这一点,但您的编辑器的荧光笔当然也应该揭开它的面纱。您使用 NetBeans 甚至 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:你的表名是否真的包含#?也许您应该在这些表名周围使用反引号,例如:

LEFT JOIN `#__jquarks_users_profiles`

【讨论】:

  • 感谢您的帮助 GolezTrol,很乐意提供帮助,现在我收到错误说明:警告:为 foreach() 提供的参数无效
  • 输出查询的代码:echo '&lt;table style="' . $tableStyle . '" cellpadding="7" cellspacing="7"&gt;'; echo "&lt;tr&gt; &lt;th&gt; Quiz Title &lt;/th&gt;&lt;th&gt; Score &lt;/th&gt;&lt;th&gt;Maximum Score &lt;/th&gt;&lt;th&gt; Unanswered &lt;/th&gt; &lt;th&gt;Finished On &lt;/th&gt;&lt;/tr&gt;"; $row = $database-&gt;loadRowList(); foreach($row as $valuearray) { echo '&lt;tr style=" align="center"&gt;'; foreach($valuearray as $field) { echo "&lt;td&gt;$field&lt;/td&gt;"; } echo "&lt;/tr&gt;"; } echo "&lt;/table&gt;"; ?&gt;
  • scoremaxScore 不是字段,而是评估列。它们不能放在WHERE 子句中。
  • 那么我能做些什么呢,我只需要渲染等于所有分数的最大分数的分数,如何更改代码来做到这一点,meabe一个变量?
  • @TonyR,这感觉像是一个新问题。也许你应该这样发布它,而不是将该代码粘贴到评论中,这会使它完全不可读。
【解决方案2】:
$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" ) ;

【讨论】:

  • 嗨,感谢您的输出,我再次收到.. Warning: Invalid argument supplied for foreach()
  • @TonyR:您是否尝试过 PHPMyAdmin 中的查询(以确保它至少可以)?如果查询正常,那么问题可能出在您的 PHP 代码中。但你还没有发布。编辑您的问题并添加 PHP 代码。我在您发布的代码中看不到foreach()
猜你喜欢
  • 2011-08-18
  • 2016-08-05
  • 2015-09-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 2015-07-17
相关资源
最近更新 更多