1

検索クエリを処理するために mysql コードまたは php が必要です

この 5 つの商品が店舗にあるとします。

ID | TYPE   | Pattern

1. | Kilner | scissor
2. | Kilner | forcep
3. | Boyd   | scissor Small
4. | Boyd   | scissor large
5. | Boyd   | forcep
6. | Boyd   | clamp

以下の操作を処理するためのmysqlクエリを手伝ってもらえますか

「boyd」を検索すると、3 4 5 と 6 の数字が表示されます。

「はさみ」を検索すると、数字の 1 3 と 4 が表示されます。

「boyd scissor」で検索すると、3 番と 4 番が表示されます。

「Kilner scissor」を検索すると、1 つだけが表示されます。

教えてください ありがとう

4

4 に答える 4

2

mysqlでそれを行う方法は全文検索です

SELECT *, MATCH(field) AGAINST ('word1 word2 word3') AS score
FROM table
WHERE MATCH(field) AGAINST('word1 word2 word3')

このチュートリアルを見てくださいhttp://devzone.zend.com/26/using-mysql-full-text-searching/

于 2012-11-03T11:24:59.960 に答える
1

このクエリを試してください

SELECT * FROM `table` WHERE `name` LIKE '%$search_var%'

PDO 構造

$db = $this->pdo->prepare("SELECT * FROM `table` WHERE `name` LIKE :mysearch");
$db->execute( array("mysearch"=>'%'.$mysearch.'%') );
于 2012-11-03T11:22:26.530 に答える
0

あなたが尋ねるクエリは少し複雑です。両方の列で一致を返す必要がありますが、両方の列が一致する場合は、単一の一致を破棄する必要があります。

これは、何らかの方法で、2 つの一致を必要とするクエリと 1 つの一致を必要とするクエリを実行し、結果を比較して適切なセットを返すことを意味します。

パフォーマンスに関しては、両方をフェッチする 1 つのクエリを実行し、結果を PHP で処理する方がよいと思います (スーパークエリを使用して MySQL で処理できます)。

そう:

// We split keywords
$keywords = array_unique(preg_split('/\s+/', $search));
$inset    = array();
foreach($keywords as $keyword)
    $inset[] = "'".mysql_real_escape_string($keyword)."'";
$sql_in   = '('.implode(',', $inset).')';

$query    = "SELECT *, IF(type IN $sql_in, 1,0)+IF(pattern IN $sql_in,1,0) AS matches FROM mytable WHERE (type IN $sql_in) OR (pattern IN $sql_in) ORDER BY matches DESC;";

上記は推奨されない mysql_ 関数を使用しています。PDO を使用すると、次のようになります。

$keywords = array_unique(preg_split('/\s+/', $search));
// Generate a (?,?,?..?) template as long as $keywords
$sql_in   = '('.implode(',', array_fill(0, count($keywords), '?')).')';

$query    = "SELECT *, IF(type IN $sql_in, 1,0)+IF(pattern IN $sql_in,1,0) AS matches FROM mytable WHERE (type IN $sql_in) OR (pattern IN $sql_in) ORDER BY matches DESC;";
$st       = $db->prepare($query);
$st->execute($keywords);

上記は完全一致を使用しているため、"Boyd" は "Boyd" との一致を取得しますが、"Boy" は取得しないことに注意してください。%この動作を変更するには、一致する文字を使用します。

ここで、MyTable と同一であるが、2 または 1 のいずれかを含む「matches」列が 1 つあるテーブルを取得します。WHERE制限のため、0 を含めることはできません。2 つの一致のうちの 1 つが真であり、1 としてカウントされる必要があります。

2 が最初に返されるので、次のことができます。

if (!isset($matches))
    $matches = $tuple['matches'];
else
    if ($tuple['matches'] < $matches)
        break;

つまり、最初の (そして最も高い) 値を保存し、後続のタプルにはその値のみを受け入れます。下位一致が来るとすぐに、ループを終了してカーソルを閉じます。

これは、MySQL で

SELECT * FROM ( the above query ) AS newTable
    WHERE matches = ( 
        SELECT MAX(matches) FROM ( the above query ) AS tmpTable
    );

ただし、パフォーマンスが低下します。

于 2012-11-03T12:18:46.830 に答える
0
$search=array('byod','scissor');
$st=""; $st2="";
foreach($search as $value){$st.="type=%$value% or ";$st2.="pattern=%$value% or ";}
$st2=substr($st2,0,-3);
echo "select * from tablename where $st $st2";
于 2012-11-03T12:59:20.387 に答える