過去 2 日間のプロジェクト開発では、いくつかのより実用的な関数を実装する必要があり、2 つの SQL が使用されました。要約すると、次回は忘れてしまうのではないかと思います。
1. 送信されたコンテンツと一致するコンテンツをデータベースで検索します
例: 送信されたデータが「水泳」の場合、データベース内の「水泳が好き」という単語は一致するとみなされますが、これはまだ一致していません。たとえば、私が提出したのは「週末に水泳に行きます」というもので、実際には似たような意味の「水泳」に関するコンテンツがありましたが、like を使用して見つけることができなかったので、次のように考えました。関数にカプセル化された SQL:
function 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) とタイトルのような '%" .$tagTitle."%' )) LENGTH(title) で並べ替えます ";
$data =& $db->getAll($sql);
if( DB::isError($data)){
return $this ->returnValue($data->getMessage());
}else{
return $data;
}
}
sql:
を見てくださいselect $cols from ".$TableName." where title != ' ' and (LOCATE(title,'$tagTitle') or ((issystem = 1 or LENGTH(title) <= $titleFeildStrLen) and title like '%" .$tagTitle."%' )) LENGTH(title) で並べ替えます
実際には、これは 2 回の照合で、1 回目は送信されたタグをデータベース内のタグと照合する前方照合で、2 回目はデータベース内のタグと照合します。送信されたタグを含むデータベース。
重要なのは LOCATE() 関数で、これも長さを制限します。これは、mysql のエンコーディングが次のとおりであるためです:
set names 'utf8'
これは utf8 であるため、中国語の文字は 3 バイトを占め、文字だけが必要になります。は 1 バイトを占めるため、上記:
$titleFeildStrLen = 24;
は、一致するタグの範囲内の 8 文字と 24 文字です。
2. 同様の並べ替え
たとえば、データベースの内容は次のとおりです:
Beijing 1023 1
Tianjin 2301 1
Shanghai 3450 1
Tianjin 4520 1
Beijing 3 902 1
それでは私はすべての都市データを抽出し、各都市データの合計数を他の都市の合計数と比較して並べ替えたいとします。
関数コードは次のとおりです:
function getMostCity($num)
{
$sql = "select count(id) as num,city from ".$TableName." where city != '' group by数値による都市の順序制限 0,$num;";
$data =& $db->getAll($sql);
if($db->isError($data))
return false;
else
Return $data;
}
上記の SQL ステートメントに注目してみましょう:
select count(id) as num,city from ".$TableName" where city != '' group by city. order by num desc limit 0,$num
中心となるのは都市ごとのグループであり、類似した都市を集めて、それらを最も多いものから最も少ないものへと並べ替えます。
作成者: heiyeluren
writeTime: 2005-07-01 14:35