【问题标题】:If more than one result, rank values from one field in db and return only the highest/lowest ranked value如果有多个结果,则对 db 中一个字段的值进行排名,并仅返回排名最高/最低的值
【发布时间】:2012-04-03 08:59:01
【问题描述】:

我正在尝试找出最好的方法,但不确定如何。有人可以帮帮我吗?

假设我有 4 个标记 - 金、银、铜和开发中 这些标记之一将是 db 中 $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;

【问题讨论】:

    标签: php mysql arrays


    【解决方案1】:

    为您的价值观分配权重,最好在表格中。

    这样使用:

    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 来过滤您的结果。

    希望这会有所帮助。

    【讨论】:

    • 似乎很棒的解决方案将开始实施,并让您知道我的进展情况。谢谢
    【解决方案2】:

    您可以通过多种方式执行此操作,按映射权重的字段排序,加入另一个具有权重的表并获取权重。 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是他的分数)

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

    测试后由 Codded 编辑:

    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
    

    【讨论】:

    • 谢谢 - 我不想按 SCORE_WEIGHTAGE 排序,我想获得最高的并只返回查询中的一行,所以(其中 SCORE_WEIGHTAGE 是最高的)。我该怎么做?
    • 你可以使用 LIMIT 1 只返回第一个结果
    • 我不得不修改您的查询,现在它可以工作了。但是在进行第一次查询后和一段时间后努力让它工作......有什么想法吗?
    • 你有什么问题?
    【解决方案3】:

    在实现了 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 = '';
        }
    

    【讨论】:

      猜你喜欢
      • 2013-09-21
      • 2023-01-19
      • 2022-01-27
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多