我正在使用一个有 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
如果单级属性按字母顺序排列,我会更高兴。