10 列のテーブルを使用しています。1 つ目は幅広いカテゴリで、次の 9 つは上に行くほど具体的な概念になります。すべての行にはカテゴリと少なくとも 1 番目の属性がありますが、それ以降は空白の場合があります。
キーワードのフルテキスト検索結果を、最初にカテゴリ内の結果の数でグループ化し、次に可能な限り高い属性でグループ化するクエリを作成しようとしています。したがって、インスタンス数が 30 の猫は、インスタンス数が 10 の猫よりも前になります。ただし、そのカテゴリ内では、9 番目の属性を持つすべての結果が、9 番目の列が空の結果の前に一番上になります。
以下は、私がこれでどこにいるのかを示す 2 つの主要なコードです。
$sql = "SELECT *, MATCH (SubCat09Name) AGAINST ('".$keyword."') AS res9, MATCH (SubCat08Name) AGAINST ('".$keyword."') AS res8, MATCH (SubCat07Name) AGAINST ('".$keyword."') AS res7, MATCH (SubCat06Name) AGAINST ('".$keyword."') AS res6, MATCH (SubCat05Name) AGAINST ('".$keyword."') AS res5, MATCH (SubCat04Name) AGAINST ('".$keyword."') AS res4, MATCH (SubCat03Name) AGAINST ('".$keyword."') AS res3, MATCH (SubCat02Name) AGAINST ('".$keyword."') AS res2, MATCH (SubCat01Name) AGAINST ('".$keyword."') AS res1, MATCH (カテゴリー) AGAINST ('".$keyword."') AS res15 FROM スタッフタクソノミー どこ MATCH (SubCat09Name, SubCat08Name, SubCat07Name, SubCat06Name, SubCat05Name, SubCat04Name, SubCat03Name, SubCat02Name, SubCat01Name, Category) AGAINST ('".$keyword." IN BOOLEAN MODE') ORDER BY res15 DESC、res9 DESC、res8 DESC、res7 DESC、res6 DESC、res5 DESC、res4 DESC、id DESC LIMIT 25000";
また:
foreach($mvres as $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 .= '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.'';} $応答.= ''; $catHead = $res->Category; if($catHead != $mvres[$i+1]->Category){$response .= '';} $i++; } }
このデータベース設計が初歩的すぎることは承知しています。それも私の質問の一部です。カテゴリ テーブルを分割して、元のテーブルにインデックスを付ける価値はありますか? それは84,000行で、これが私が得た方法です。
専門家の洞察をいただければ幸いです。
+
さらに、 or-
を my に追加して$keyword
も、望ましいブール効果が得られないことがわかりました。私もそれがうまくいくといいのですが...
アップデート:
さて、私は次の点でかなり満足しています。
SELECT * FROM スタッフタクソノミー どこ MATCH (カテゴリ) AGAINST ('".$keyword."' IN BOOLEAN MODE) || MATCH (SubCat01Name) AGAINST ('".$keyword."' IN BOOLEAN MODE) || MATCH (SubCat02Name) AGAINST ('".$keyword."' IN BOOLEAN MODE) || MATCH (SubCat03Name) AGAINST ('".$keyword."' IN BOOLEAN MODE) || MATCH (SubCat04Name) AGAINST ('".$keyword."' IN BOOLEAN MODE) || MATCH (SubCat05Name) AGAINST ('".$keyword."' IN BOOLEAN MODE) || MATCH (SubCat06Name) AGAINST ('".$keyword."' IN BOOLEAN MODE) || MATCH (SubCat07Name) AGAINST ('".$keyword."' IN BOOLEAN MODE) || MATCH (SubCat08Name) AGAINST ('".$keyword."' IN BOOLEAN MODE) || MATCH (SubCat09Name) AGAINST ('".$keyword."' IN BOOLEAN MODE) ORDER BY カテゴリ ASC、 length(SubCat09Name) + length(SubCat08Name) + length(SubCat07Name) + length(SubCat06Name) + length(SubCat05Name) + length(SubCat04Name) + length(SubCat03Name) + length(SubCat02Name) + length(SubCat01Name) DESC, SubCat09Name ASC、SubCat08Name ASC、SubCat07Name ASC、SubCat06Name ASC、SubCat05Name ASC、SubCat04Name ASC、SubCat03Name ASC、SubCat02Name ASC、SubCat01Name ASC リミット 25000
単一レベルの属性がアルファベット順に並べられていればさらに嬉しいです。