過去 2 日間のプロジェクト開発では、いくつかの実用的な関数を実装する必要があり、2 つの SQL を使用しました。要約すると、次回は忘れてしまうのではないかと思います。
1. 送信されたコンテンツと一致するコンテンツをデータベースから取得します
たとえば、送信されたデータが「水泳」の場合、データベース内の「水泳が好き」という単語は一致するとみなされますが、これではまだ十分ではありません。たとえば、「週末に水泳に行きます」と入力した場合、はデータベース内で「泳いでいる」です。 の内容は実際には似たような意味ですが、like を使用してそれを見つけることができなかったので、関数にカプセル化された次の SQL を考えました:
関数 getRelationTags($tagTitle,$cols="*")
{
$titleFeildStrLen = 24; //3*8 漢字 4 文字または 24 文字
if ("" == $tagTitle) return false;
$sql = "select $cols from ".$TableName." where title != '' and (LOCATE(title,'$tagTitle') or ((issystem = 1 or LENGTH(title) <= $titleFeildStrLen) and title like '%".$tagTitle."%' )) LENGTH(タイトル) で並べる ";
$data =& $db->getAll($sql);
if(DB::isError($data)){
return $this->returnValue($data->getMessage());
}その他{
$data を返します;
}
}
SQLを見てください:
select $cols from ".$TableName." where title != '' and (LOCATE(title,'$tagTitle') or ((issystem = 1 or LENGTH(title) <= $titleFeildStrLen) and title like '%" .$tagTitle."%' )) 長さ(タイトル)で並べ替えます
実際には、これは 2 回の照合で、1 回目は送信されたタグとデータベース内のタグを照合する前方照合で、2 回目はデータベース内のタグと送信されたタグを照合します。
重要なのは LOCATE() 関数であり、mysql のエンコーディングが次のとおりであるため、この関数も長さを制限します。
名前「utf8」を設定します
utf8 なので、中国語の文字は 3 バイトを使用し、文字は 1 バイトしか使用しないため、上記は次のようになります:
$titleFeildStrLen = 24;
つまり、24 文字の範囲内の 8 つの漢字とタグを照合します。
2. 類似ソート
たとえば、データベースの内容は次のとおりです:
北京 1023 1
天津 2301 1
上海 3450 1
天津 4520 1
北京 3902 1
次に、すべての都市データを抽出し、各都市データの合計数を他の都市の合計数と比較して、並べ替える必要があります。
関数コードは次のとおりです:
関数 getMostCity($num)
{
$sql = "select count(id) as num,city from ".$TableName." where city != '' group by city order by num desc limit 0,$num;";
$data =& $db->getAll($sql);
if($db->isError($data))
false を返します;
それ以外
$data を返します;
}
上記の SQL ステートメントに注目してみましょう:
select count(id) as num,city from ".$TableName." where city != '' 数値による順序でグループ化 制限 0,$num
中心となるのは都市ごとのグループで、類似した都市を収集し、最も多い都市から最も少ない都市へと並べ替えます。