在SQL结果中排序优先级

时间:2011-11-23 03:25:45

标签: php mysql

下面是生成模型列表的库的一部分.... ->getBy()部分只接受SQL并将其放在SQL中的WHERE子句之后。所以它执行为:WHERE site_id = ? ORDER BY name ASC

/**
 * Get areas
 */
public function getAreas() {
    return $this->modelFactory('area')->getBy('site_id = ? ORDER BY name ASC', array($this->siteId));
}

/**
 * Get nested areas
 */
public function getNestedAreas() {
    $nestedAreas = array();
    $areas = $this->getAreas();
    if (is_array($areas)) {
        foreach ($areas as $area) {
            //parent areas
            if ($area->getParentId() == NULL) {
                $nestedAreas[$area->getId()]['area'] = $area;
            } else {
                $nestedAreas[$area->getParentId()]['subareas'][] = $area;
            }
        }
        $areas = $nestedAreas;
    } else {
        $areas = array();
    }
    return $areas;
}

最终结果如下:

阵列(    阵列(       'area'=>新区域模型()//肯塔基州的areaModel       'subareas'=>阵列(            新区域模型(),// Cincinatti的areaModel            路易斯维尔的新areaModel(),// areaModel            新区域模型()//列克星敦区域模型       )    ) )

此设置存在的问题是,原始ORDER BY会将俄亥俄州放在我的嵌套区域的顶部,因为它的子区域Akron / Canton首先显示在ORDER BY。像这样:

            <select name='area_id'>
                <optgroup label='Ohio'>
                     <option value='905'>Akron / Canton</option>
                     <option value='1154'>Cincinnati</option>
                     <option value='1155'>Cleveland Eastside</option>
                     <option value='908'>Cleveland Westside</option>
                     <option value='910'>Dayton</option>
                     <option value='1394'>Toledo</option>
                </optgroup>
                <optgroup label='Alabama'>
                     <option value='988'>Birmingham, AL</option>
                     <option value='1224'>Huntsville</option>
                     <option value='712'>Mobile / Baldwin County</option>
                ....

是否可以简单地调整我的查询,以便parent_id IS NULL之前对那些具有parent_id

整数值的人正确排序结果

1 个答案:

答案 0 :(得分:1)

与MSSQL的isnull一样,MySQL有ifnull

ORDER BY IFNULL(parent_id, 0)

会将null parent_id放在具有实际值的那些之前。