0

とても簡単な問題です。

テキスト フィールドにテキストが含まれているレコードを検索して、フォームのオートコンプリート フィールドに入力したいと考えています。課題は、結果を最初の 20 レコードに制限したいが、フィールドの最初にある一致を優先したいということです。

これを行う方法は、for 10 のクエリを実行してfield LIKE "%term"から、レコード where for 10 を追加field LIKE "%term%"することです。2 つの検索が必要です。

テーブルの 1 つのクエリだけでこれを行うことは可能ですか? フィールドでの試合の位置による順序付け?

4

3 に答える 3

4

はい、検索文字列の最初の出現順で並べることができます。(フィールド LIKE "term%" を書きたかったとします。)

SELECT *, LOCATE('term', field) as rev_score FROM table WHERE field LIKE "%term%" ORDER BY rev_score DESC LIMIT 20;

ただし、このクエリは、フィールド "term%" よりもはるかに遅くなる可能性があります (フィールドにインデックスがあると仮定します)。

  • あなたの場合、フィールド LIKE "term%" は、フィールドのインデックスによって満たされる可能性があり、その結果、範囲クエリになりますが、それでも高速です。
  • field LIKE "%term%" LIMIT 10 順序を使用しない場合でも、高速化できます(より速い)。検索ワードやデータ分布にもよりますが、私が書いたソリューションよりも統計的に2倍高速です。その理由は、MySQL が「用語」を検索するテーブルをスキャンし始めるためです (ここではインデックスを使用できません)。10 個の要素が見つかると停止します。これは、テーブルの最初にある場合があります。
  • 私が書いたものは、計算された値のファイルソートよりも、 MySQL がテーブル全体でフルスキャンを実行し、すべての行で「用語」をチェックするようにします。おそらく、単一のテーブル ルックアップで起こりうる最悪の事態です。

両方のバージョンを試して、より高速なバージョンを使用することをお勧めします。または、データセットが大きい場合は、MySQL の全文検索機能をチェックアウトできます (MYISAM にはそれがあり、MySQL 5.6 以降では InnoDB もサポートしています)。

于 2013-07-29T14:58:15.723 に答える
1

私はするだろう:

SELECT * FROM table WHERE field LIKE '%term%' order by IF(field REGEXP '^term.*',0,1),field LIMIT 20;
于 2013-07-29T15:10:23.473 に答える
1

頭いい!可能かどうかはわかりませんが、もう少しうまくやれる方法は知っています。

<?php

$q = 'term';
$limit = 20;

$first = mysql_query("SELECT * FROM some_table WHERE name LIKE '%$q' ORDER BY name LIMIT $limit");
$first_len = !$sql?0:mysql_num_rows($first);
$limit -= $first_len;
$second = mysql_query("SELECT * FROM some_table WHERE name LIKE '%$q%' LIMIT $limit");
$second_len = !$sql?0:mysql_num_rows($second);

if (!$first_len && !$second_len) {
    exit('No results found.');
}

function handleSearchResultRow($row) {
    echo $row['name'].'<br/>';
}

if ($first_len)
    while ($row = mysql_fetch_array($first))
        handleSearchResultRow($row);

if ($second_len)
    while ($row = mysql_fetch_array($second))
        handleSearchResultRow($row);

?>

多田!同じ結果が得られますが、コードが少し増えます。これにより、常に最大 20 件の結果が得られるようになり、結果は用語から始まります。

「フィールド内の一致の位置による順序付け」が本当に必要な場合は、すべての結果の配列を作成し、php strpos() で並べ替える必要があると思います。しかし、SQL は非常に強力であり、おそらくこれを行う力も持っています。別の回答を投稿して、その方法がわかったら教えてください。:)

于 2013-07-29T14:56:53.160 に答える