SQL ищет несколько значений в одном поле

Я создаю простой алгоритм поиска, и я хочу разбить мою строку с пробелами и искать на ней свой 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

Возможно ли это?

Заранее спасибо

Ответы

Ответ 1

Да, вы можете использовать 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 (по мере того как вы пробовали) требует, чтобы ВСЕ условия были истинными, использование OR требует, чтобы по крайней мере один был истинным.

Ответ 2

Попробуйте это

Используя 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 ;

Ответ 3

Здесь частично ответили: MySQL, как несколько значений

Советую против

$ 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();

Я не проверял этот код, но это то, что я бы сделал в вашем случае. Надеюсь, это поможет.

Ответ 4

Это будет отлично работать в обоих случаях, одно или несколько полей поиска нескольких слов.

Надеюсь, это кому-нибудь поможет. Спасибо

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+'%' )
        )