0

複数のフィールドで複数の用語を検索して、MySQL データベースから結果を取得しようとしています。以下のスクリプトは機能していますが、必要な方法ではなく、実行方法を見つけるのに苦労しています。

現在、 「apples peaches」を検索すると、任意のフィールドに「apples」または「peaches」が含まれるすべての結果が返されます。つまり、レコードに「apples」が含まれていて「peaches」が含まれていない場合、結果が返されます。

意図した動作では、特定のレコードで任意のフィールドのすべての検索語が見つかった場合にのみ結果を取得する必要があります。つまり、 「りんご」はフィールド f1 にあり、「桃」はフィールド f2 にあります。「apples」のみが見つかった場合、それは結果ではありません。

<?php
if (!isset($_REQUEST['term'])) exit;
$dblink = mysql_connect('localhost', 'root', 'pass') or die(mysql_error());
mysql_select_db('mytable');
mysql_set_charset('utf8', $dblink);
// query the database table for strings that match 'term'
$lcSearchVal = mysql_real_escape_string($_REQUEST['term']);
$lcSearchVal = explode(' ', $lcSearchVal);
$sql = 'SELECT id, f1, f2, f3, f4 FROM mytable 
        WHERE (';
$parts = array();
foreach($lcSearchVal as $lcSearchWord) {
    if ($lcSearchWord <> "") {
        $parts[] = '`id` LIKE "%' . $lcSearchWord . '%"';
    }
    if ($lcSearchWord <> "") {
        $parts[] = '`f1` LIKE "%' . $lcSearchWord . '%"';
    }
    if ($lcSearchWord <> "") {
        $parts[] = '`f2` LIKE "%' . $lcSearchWord . '%"';
    }
    if ($lcSearchWord <> "") {
        $parts[] = '`f3` LIKE "%' . $lcSearchWord . '%"';
    }
    if ($lcSearchWord <> "") {
        $parts[] = '`f4` LIKE "%' . $lcSearchWord . '%"';
    }
}
$sql.= implode(' OR ', $parts) . ') order BY id desc limit 0,10';
$rs = mysql_query($sql, $dblink);
// loop through each string returned and format the response for jQuery
$data = array();
$data[] = array('value' => "", 'label' => " >> Last 10 results:", 'desc' => "");
if ($rs && mysql_num_rows($rs)) {
    while ($row = mysql_fetch_array($rs, MYSQL_ASSOC)) {
        if (strlen($row['f3']) > 250) {
            $row['f3'] = substr($row['f3'], 0, 250) . " [...]";
        }
        $data[] = array('value' => $row['id'], 'label' => $row['id'] . '/' . $row['f1'] . ' (' . $row['f2'] . ') ' . $row['f4'], 'desc' => $row['f3']);
    }
}
// jQuery wants JSON data
echo json_encode($data);
flush();
?>

ご意見ありがとうございます

4

2 に答える 2

1

全文インデックスとクエリの実行を検討してください。

http://www.devarticles.com/c/a/MySQL/Getting-Started-With-MySQLs-Full-Text-Search-Capabilities/

この種のものに like ステートメントを使用するよりもはるかに優れています。

于 2012-08-30T22:40:05.513 に答える
0

次の点を考慮してください。

$lcSearchVal = 'one two three';
$lcSearchVal = explode(' ', $str);
foreach ($lcSearchVal as &$lcSearchWord) {
    $lcSearchWord = '`id` LIKE "%' . $lcSearchWord . '%" AND ';
}
$conditions = rtrim(implode('', $val), ' AND ');

echo $conditions; //returns `id` LIKE "%one%" AND `id` LIKE "%two%" AND `id` LIKE "%three%"

$conditions は、WHERE 条件としてクエリに挿入できます。

于 2012-08-30T22:45:54.540 に答える