繁体   English   中英

如果结果不止一个,则对db中一个字段的值进行排名,并仅返回最高/最低排名值

[英]If more than one result, rank values from one field in db and return only the highest/lowest ranked value

我正在尝试找出执行此操作的最佳方法,但不确定如何操作。 有人可以帮我吗?

假设我有4个标记-金,银,铜和发展中标记之一就是来自数据库的$ gsb ['gsb']值。

下面的代码获取课程,并回显img和链接。 我苦苦挣扎的一点是如何对上面的4个值进行排名,因此,如果返回的结果超过一个,它将根据选择的排名获得最高或最低值,并且仅回显该结果/ img

希望这很清楚。 如有任何帮助/指导,我将不胜感激。

        $metacourses = mysql_query("SELECT * FROM mdl_course_meta where parent_course = $courseid");
        while($parentcourse = mysql_fetch_assoc($metacourses)){
        //Select GSB for course
        $parentcourseid = $parentcourse['child_course'];
        $gsb = mysql_fetch_array(mysql_query("SELECT * FROM mdl_gsb_content where course = $parentcourseid"));  


        //Used for $img name
        if ($gsb['gsb']=="") {$thegsbscore = "in_development";}
        else {$thegsbscore = $gsb['gsb'];}

        if ($viewgsb == 'Yes'){
        $img = '<div align="center"><img src="'.$CFG->wwwroot.'/blocks/gsb/images/'.strtolower($thegsbscore).'.png" width="90" height="98"></div>';
        $link = '<p align="center"><b><a href="'.$CFG->wwwroot.'/blocks/gsb/gsb_explained.htm" target="_blank">How can I improve my course medal?</a></b></p>';
        }   
        else {
          $img = '';
          $message = '';
          $viewgsb = '';
          $link = '';
        }
}

$this->content         =  new stdClass;    
$this->content->text   = $message . $img . $link;    
$this->content->footer = '';     
return $this->content;
return $this->content->text;

将权重分配给您的值,最好在表格中。

像这样使用:

TABLE_WEIGHT (It's a better idea to store these in a separate table, that way you can always add/delete more scores, irrespective of other tables)

ID(PRIMARY KEY) SCORE_NAME(VARCHAR) SCORE_WEIGHTAGE(INT/ENUM)
1               In Development      1
2               Bronze              2
3               Silver              3
4               Gold                4

现在,您始终可以在第二个查询中使用SQL JOIN对数据进行排序。 另外,如果有多个结果,则可以使用PHP的usort过滤结果。

希望这可以帮助。

您可以通过多种方式执行此操作,通过映射权重的文件进行排序,连接到具有权重的另一个表并获取权重。 pushpesh是您将要做的最好的解决方案

SELECT * FROM mdl_gsb_content 
where course = $parentcourseid 
join table_weight 
on table_weight.score_name = mdl_gsb_content.gsb 
order by table_weight.SCORE_WEIGHTAGE.

(假设gsb是他的得分)

未经测试,但应该可以解决。

测试后编辑方式:

SELECT * FROM mdl_gsb_content 
JOIN mdl_gsb_scores on mdl_gsb_scores.score = mdl_gsb_content.gsb
WHERE mdl_gsb_content.courseid = $parentcourseid
ORDER by mdl_gsb_scores.rank ASC
LIMIT 1

在实现Pushpeshs权重表并解决编码SQL查询后,我终于想出了正确的方法。

    $metacourses = mysql_query("SELECT * FROM mdl_course_meta where parent_course = $courseid");
    //Select GSB for course

    $types = array();

    while(($row =  mysql_fetch_assoc($metacourses))) {
        $types[] = $row['child_course'];
    }

    $theids = implode(',',$types);


    $gsb = mysql_query("
    SELECT * FROM mdl_gsb_content 
    JOIN mdl_gsb_scores on mdl_gsb_scores.score = mdl_gsb_content.gsb
    WHERE mdl_gsb_content.courseid IN ($theids)
    ORDER by mdl_gsb_scores.rank ASC
    LIMIT 1");  

    while($score = mysql_fetch_assoc($gsb))
    //Work out img
    $thegsbscore = $score['gsb'];

    if ($viewgsb == 'Yes'){
        $img = '<div align="center"><img src="'.$CFG->wwwroot.'/blocks/gsb/images/'.strtolower($thegsbscore).'.png" width="90" height="98"></div>';
        $link = '<p align="center"><b><a href="'.$CFG->wwwroot.'/blocks/gsb/gsb_explained.htm" target="_blank">How can I improve my course medal?</a></b></p>';
        $message = '<div align="center">Your Unit VLE is:'.print_r($types).'</div><br />';

    }   
    else {
        $img = '';
        $message = '';
        $viewgsb = '';
        $link = '';
    }

暂无
暂无

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

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