0

タグを使用して広告を検索するコードを作成しました。このコードは、ユーザーが入力した検索文字列を区切り (スペース) 、LIKE 句を使用して各単語をコンマで区切ったデータベース内のタグと照合します。私は正しい結果を得ています。しかし、私が望むのは、より多くのタグと検索文字列の単語が一致する行が一番上に表示されることです。

例:- 1 行目 (db) のタグは「samung,mobile,phone」で、2 行目は「samsung,phone」で、検索文字列は「samsung mobile phone」の場合、1 行目が最初に表示されます。 2 行目よりも多くの一致があります。ORDER BY を使用してそれを行うにはどうすればよいですか。

私のコードは次のとおりです:-

<?php  require_once("db_connect.php");  ?>

<form action="" method="POST">
<input type="text" name="searchtext" />
<input type="submit" name="submit" value="Search" />
</form>
<?php
if(isset($_POST["submit"]))
{
$searchquery = $_POST["searchtext"];
$searcharray = array();

$searcharray = explode(" ",$searchquery);
if(!isset($searcharray[1]))
$searcharray[1] = "XXXXXXXX";
if(!isset($searcharray[2]))
$searcharray[2] = "XXXXXXXX";
if(!isset($searcharray[2]))
$searcharray[2] = "XXXXXXXX";
if(!isset($searcharray[3]))
$searcharray[3] = "XXXXXXXX";


$query = "select * from search where tag LIKE '%$searcharray[0],%' OR tag LIKE '%$searcharray[1],%' OR tag LIKE '%$searcharray[2],%' OR tag LIKE '%$searcharray[3],%' ";

$result=mysql_query($query);

while($row = mysql_fetch_array($result))
{
echo $row["name"]. '<br>' ;


}
4

2 に答える 2

2

比較演算子は、一致するかどうかに応じて 0 または 1 を返すため、それらを追加して一致数をカウントできます。

$searcharray = explode(" ",$searchquery);
$matchexpr = implode(' + ', array_map(function($x) { return "(find_in_set('$x', tag) > 0)";}, $searcharray));

$query = "select *, 
                 ($matchexpr) as matches
         from search
         having matches > 0
         order by matches desc";
于 2013-05-02T07:12:35.373 に答える
0

いいえ、コンマの周りにスペースはありません。

私は行を変更しました:-

$matchexpr = implode(' + ', array_map(function($x) { return "find_in_set('$x', tag) > 0";}, $searcharray)); 

$matchexpr = implode(' OR ', array_map(function($x) { return "find_in_set('$x', tag) > 0";}, $searcharray));

行を正しく取得していますが、順序が正しくありません。元の順序で行を返すのは、OR が返された値を連結しないためだと思います。

あなたのコードを使用する:_

"samsung mobile" という単語は 2 つの結果 (viv と samsung psp) を返します。"mobile samsung" は 1 つの結果 (sony mobile) のみを返します。

于 2013-05-02T08:20:35.217 に答える