0

我正在使用一个有 10 列的表。第一个是一个宽泛的类别,接下来的 9 个是随着您的上升而变得更加具体的概念。所有行都有一个类别和至少 1 号属性,但从那里开始可能是空白的。

我正在尝试编写一个查询,该查询首先按类别中的结果数分组,然后按可能的最高属性对关键字全文搜索结果进行排序。因此,具有 30 个实例的猫将排在具有 10 个实例的猫之前。但是在该类别中,具有第 9 个属性的所有结果都将位于第 9 列为空的结果之前的顶部。

下面是两个主要的代码,显示我在这方面的位置:

$sql = "选择 *,
        MATCH (SubCat09Name) 反对 ('".$keyword."') AS res9,
        MATCH (SubCat08Name) 反对 ('".$keyword."') AS res8,
        MATCH (SubCat07Name) 反对 ('".$keyword."') AS res7,
        MATCH (SubCat06Name) 反对 ('".$keyword."') AS res6,
        MATCH (SubCat05Name) 反对 ('".$keyword."') AS res5,
        MATCH (SubCat04Name) 反对 ('".$keyword."') AS res4,
        MATCH (SubCat03Name) 反对 ('".$keyword."') AS res3,
        MATCH (SubCat02Name) 反对 ('".$keyword."') AS res2,
        MATCH (SubCat01Name) 反对 ('".$keyword."') AS res1,
        MATCH (Category) 反对 ('".$keyword."') AS res15
        来自材料分类
    在哪里
     MATCH (SubCat09Name, SubCat08Name, SubCat07Name, SubCat06Name, SubCat05Name, SubCat04Name, SubCat03Name, SubCat02Name, SubCat01Name, Category) 反对 ('".$keyword." IN BOOLEAN MODE')
        按 res15 DESC、res9 DESC、res8 DESC、res7 DESC、res6 DESC、res5 DESC、res4 DESC、id DESC LIMIT 25000 排序";

并且:

    foreach($mvres 作为 $res){
    if(strlen($res->Category) > 1 || strlen($res->SubCat01Name) > 1 || strlen($res->SubCat02Name) > 1 || strlen($res->SubCat03Name) > 1 || strlen($res->SubCat04Name) > 1 || strlen($res->SubCat05Name) > 1 || strlen($res->SubCat06Name) > 1 || strlen($res->SubCat07Name) > 1 || strlen( $res->SubCat08Name) > 1 || strlen($res->SubCat09Name) > 1){

    if($catHead != $res->Category){$response .= '';}
    if($catHead != $res->Category){$response .= 'id.'" class="categoryHead">'.$res->Category.' ';}

    $response .= '';
    $response .= 'id.'" class="taxID">id: id.'">'.$res->id.'';
    if(strlen($res->SubCat01Name) > 0){$response .= ''.$res->Category.'';}
    if(strlen($res->SubCat09Name) > 0){$response .= '09:'.$res->SubCat09Name.'';}
    if(strlen($res->SubCat08Name) > 0){$response .= '08:'.$res->SubCat08Name.'';}
    if(strlen($res->SubCat07Name) > 0){$response .= '07:'.$res->SubCat07Name.'';}
    if(strlen($res->SubCat06Name) > 0){$response .= '06:'.$res->SubCat06Name.'';}
    if(strlen($res->SubCat05Name) > 0){$response .= ' 05:'.$res->SubCat05Name.'';}
    if(strlen($res->SubCat04Name) > 0){$response .= ' 04:'.$res->SubCat04Name.'';}
    if(strlen($res->SubCat03Name) > 0){$response .= ' 03:'.$res->SubCat03Name.'';}
    if(strlen($res->SubCat02Name) > 0){$response .= '02:'.$res->SubCat02Name.'';}
    if(strlen($res->SubCat01Name) > 0){$response .= ' 01:'.$res->SubCat01Name.'';}
    $response .= '';

    $catHead = $res->类别;
    if($catHead != $mvres[$i+1]->Category){$response .= '';}
    $i++;
    }
    }

我知道这个数据库设计太简陋了。所以这也是我的问题的一部分;打破类别表并索引原始表是否值得?它有 84,000 行,这就是我得到它的方式。

请任何专家的见解非常感谢!

此外,我发现添加+or-到 my$keyword并没有所需的布尔效果。我也希望它能够工作......


更新:

好吧,我对以下内容感到非常满意:

SELECT * FROM stufftaxonomy
    在哪里
     匹配(类别)反对('".$keyword."' 在布尔模式下)||
     MATCH (SubCat01Name) 反对 ('".$keyword."' 在布尔模式下) ||
     MATCH (SubCat02Name) 反对 ('".$keyword."' 在布尔模式下) ||
     MATCH (SubCat03Name) 反对 ('".$keyword."' 在布尔模式下) ||
     MATCH (SubCat04Name) 反对 ('".$keyword."' 在布尔模式下) ||
     MATCH (SubCat05Name) 反对 ('".$keyword."' 在布尔模式下) ||
     MATCH (SubCat06Name) 反对 ('".$keyword."' 在布尔模式下) ||
     MATCH (SubCat07Name) 反对 ('".$keyword."' 在布尔模式下) ||
     MATCH (SubCat08Name) 反对 ('".$keyword."' 在布尔模式下) ||
     MATCH (SubCat09Name) 反对 ('".$keyword."' 在布尔模式下)
        按类别 ASC 排序,
        长度(SubCat09Name) + 长度(SubCat08Name) + 长度(SubCat07Name) + 长度(SubCat06Name) + 长度(SubCat05Name) + 长度(SubCat04Name) + 长度(SubCat03Name) + 长度(SubCat02Name) + 长度(SubCat01Name) DESC,
        SubCat09Name ASC, SubCat08Name ASC, SubCat07Name ASC, SubCat06Name ASC, SubCat05Name ASC, SubCat04Name ASC, SubCat03Name ASC, SubCat02Name ASC, SubCat01Name ASC
        限制 25000

如果单级属性按字母顺序排列,我会更高兴。

4

0 回答 0