web-dev-qa-db-ja.com

SQLは同じフィールドの複数の値を検索します

私は単純なsearchアルゴリズムを構築しており、スペースを含む文字列を破り、その上でdbを検索します:

$search = "Sony TV with FullHD support";  
$search = explode( ' ', $search );

SELECT name FROM Products WHERE name LIKE %$search[1]% AND name LIKE %$search[2]% LIMIT 6

これは可能ですか?

前もって感謝します

23
Nir Tzezana

はい、SQL IN演算子を使用して複数の絶対値を検索できます。

SELECT name FROM products WHERE name IN ( 'Value1', 'Value2', ... );

LIKEを使用する場合は、代わりにORを使用する必要があります。

SELECT name FROM products WHERE name LIKE '%Value1' OR name LIKE '%Value2';

ANDを使用するには(試行したとおり)すべての条件がtrueである必要があり、ORを使用するには少なくとも1つの条件がtrueであることが必要です。

44
Glitch Desire

これを試して

UNIONを使用する

$sql = '';
$count = 0;
foreach($search as $text)
{
  if($count > 0)
     $sql = $sql."UNION Select name From myTable WHERE Name LIKE '%$text%'";
  else
     $sql = $sql."Select name From myTable WHERE Name LIKE '%$text%'";

  $count++;
}

WHERE INを使用

$comma_separated = "('" . implode("','", $search) . "')";  // ('1','2','3')
$sql = "Select name From myTable WHERE name IN ".$comma_separated ;
4
codingbiz

これは、1つまたは複数のフィールドが複数の単語を検索する両方の場合に完全に機能します。

これが誰かを助けることを願っています。ありがとう

declare @searchTrm varchar(MAX)='one two three four'; 
--select value from STRING_SPLIT(@searchTrm, ' ') where trim(value)<>''
select * from Bols 
WHERE EXISTS (SELECT value  
    FROM STRING_SPLIT(@searchTrm, ' ')  
    WHERE 
        trim(value)<>''
        and(    
        BolNumber like '%'+ value+'%'
        or UserComment like '%'+ value+'%'
        or RequesterId like '%'+ value+'%' )
        )
1
user2662006

これはここで部分的に回答されています: MySQL Like multiple values

反対する

$ search = explode( ''、$ search);

検索バーを介してSQLを挿入する傾向があるため、SQLクエリに直接入力します。 「-; DROP TABLE name;

$ search = str_replace( '"'、" '' "、search);

しかし、それでも完全に安全ではありません。より安全にするには、SQL準備済みステートメントを使用する必要があります。正規表現を使用すると、必要なものを準備して作成するための関数を作成するのがはるかに簡単になります。

function makeSQL_search_pattern($search) {
    search_pattern = false;
    //escape the special regex chars
    $search = str_replace('"', "''", $search);
    $search = str_replace('^', "\\^", $search);
    $search = str_replace('$', "\\$", $search);
    $search = str_replace('.', "\\.", $search);
    $search = str_replace('[', "\\[", $search);
    $search = str_replace(']', "\\]", $search);
    $search = str_replace('|', "\\|", $search);
    $search = str_replace('*', "\\*", $search);
    $search = str_replace('+', "\\+", $search);
    $search = str_replace('{', "\\{", $search);
    $search = str_replace('}', "\\}", $search);
    $search = explode(" ", $search);
    for ($i = 0; $i < count($search); $i++) {
        if ($i > 0 && $i < count($search) ) {
           $search_pattern .= "|";
        }
        $search_pattern .= $search[$i];
    }
    return search_pattern;
}

$search_pattern = makeSQL_search_pattern($search);
$sql_query = "SELECT name FROM Products WHERE name REGEXP :search LIMIT 6"
$stmt = pdo->prepare($sql_query);
$stmt->bindParam(":search", $search_pattern, PDO::PARAM_STR);
$stmt->execute();

このコードはテストしていませんが、これは私があなたの場合に行うことです。これがお役に立てば幸いです。

0
Volfegan