2012-02-23 47 views
17

tôi biết làm thế nào để thực hiện một SQL tương tự truy vấn% cho một giá trị duy nhất như vậy:SQL NHƯ% trong mảng

SELECT * FROM users WHERE name LIKE %tom%; 

nhưng làm thế nào để tôi làm điều này nếu các điều khoản tìm kiếm cho NHƯ tôi xuất phát từ một mảng? Ví dụ, giả sử chúng ta có một mảng như thế này:

$words = array("Tom", "Smith", "Larry"); 

Làm thế nào để thực hiện SQL của tôi NHƯ% để tìm kiếm các từ trong mảng của tôi như:

SELECT * FROM users WHERE name LIKE %[each_element_from_my_array]% 

KHÔNG đặt toàn bộ truy vấn bên trong vòng lặp foreach hoặc gì đó

EDIT: Tôi quên đề cập rằng tôi đang làm điều này trong CakePHP bên trong các điều kiện của phương pháp tìm kiếm ('all') để làm phức tạp mọi thứ một chút.

Cảm ơn

+0

Câu hỏi của bạn có ít nhất '5' phiếu bầu cho thẻ [tag: like-operator]. Tôi có thể vui lòng yêu cầu bạn đề xuất [tag: sql-like] làm [từ đồng nghĩa] (http://stackoverflow.com/tags/like-operator/synonyms) không? – Kermit

Trả lời

25
$sql = array('0'); // Stop errors when $words is empty 

foreach($words as $word){ 
    $sql[] = 'name LIKE %'.$word.'%' 
} 

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); 

Chỉnh sửa: mã cho CakePHP:

foreach($words as $word){ 
    $sql[] = array('Model.name LIKE' => '%'.$word.'%'); 
} 

$this->Model->find('all', array(
    'conditions' => array(
     'OR' => $sql 
    ) 
)); 

Đọc trên công cụ này: http://book.cakephp.org/1.3/en/view/1030/Complex-Find-Conditions

+1

suy nghĩ của tôi chính xác. câu trả lời hay! chỉ cần cẩn thận khi có một mảng trống có thể gây ra lỗi SQL ... –

+0

Tôi nghĩ 'HOẶC 0' sẽ làm tốt ...;) –

+0

Điều này sẽ hiệu quả, nhưng làm cách nào để thực hiện điều này bên trong khung tìm kiếm ('tất cả') chức năng (Xem chỉnh sửa) – user765368

4

Bạn không thể. Nó sẽ phải là một chuỗi field like %..% or field like %..% or .... Một mệnh đề where ... in chỉ trích xuất các chuỗi phù hợp, không hỗ trợ cho các ký tự đại diện.

11

Trong trường hợp của SQL tiêu chuẩn, nó sẽ là:

SELECT * FROM users WHERE name LIKE '%tom%' 
         OR name LIKE '%smith%' 
         OR name LIKE '%larry%'; 

Vì bạn đang sử dụng MySQL có thể sử dụng RLIKE (a.k.a. REGEXP)

SELECT * FROM users WHERE name RLIKE 'tom|smith|larry'; 
+0

'RLIKE' đã xảy ra là một giải pháp hoàn toàn tuyệt vời cho tôi, cảm ơn! ! ;) –

3

thử sử dụng REGEXP

SELECT * FROM users where fieldName REGEXP 'Tom|Smith|Larry'; 
0

tôi chỉ cần lấy mã số 472084.

$sql = array('0'); // Stop errors when $words is empty 

foreach($words as $word){ 
    $sql[] = 'name LIKE %'.$word.'%' 
} 

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); 

Đối với bản thân tôi, tôi đã phải sửa đổi nó bởi vì nó trở lại cho tôi một lỗi SQL. Tôi đăng nó cho những người sẽ đọc chủ đề.

foreach($words as $word){ 
    $sql[] = 'name LIKE \'%'.$word.'%\''; 
} 

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); 

Sự khác biệt giữa chúng là về báo giá, mysql DB của tôi cho biết có sự cố! vì vậy tôi phải thoát khỏi báo giá từ $sql[] = 'name LIKE %'.$word.'%' và giờ nó hoạt động hoàn hảo.

0

Blockquote

/** * nổ tung một mảng đa chiều của các giá trị, nhóm ký tự khi khác nhau với "[]" khối. * @param array $ array Mảng để implode * @return string Mảng được mã hóa */ hoArray2SqlLike chức năng ($ array) { if (!is_array ($ array)) trả về mảng $;

$values = array(); 
$strings = array(); 

foreach ($array as $value) 
{ 
    foreach (str_split($value) as $key => $char) 
    { 
     if (! is_array($values[ $key ])) 
     { 
      if (isset($values[ $key ])) 
      { 
       if ($values[ $key ] != $char) 
       { 
        $values[ $key ]  = array($values[ $key ]); 
        $values[ $key ][] = $char; 
       } 
      } 
      else 
       $values[ $key ] = $char; 
     } 
     elseif (! array_search($char , $values[ $key ])) 
      $values[ $key ][] = $char; 
    } 
} 

foreach ($values as $value) 
{ 
    if (is_array($value)) 
     $value = '['.implode('', $value).']'; 

    $strings[] = $value; 
} 

return implode('', $strings); 

}

0

Trong mã này, chúng tôi không thể có được dấu ngoặc kép trong truy vấn sql

$sql = array('0'); // Stop errors when $words is empty 

foreach($words as $word){ 
    $sql[] = 'name LIKE %'.$word.'%' 
} 

$sql = 'SELECT * FROM users WHERE '.implode(" OR ", $sql); 

SELECT * FROM person where name like %"Tom"% OR name like %"Smith"% OR name like %"Larry"%; 
// error in double quotes and % is out side of Double quotes . 

Hoặc bạn cũng có thể sử dụng dấu phẩy giá trị tách ra: -

$name = array(Tom, Smith, Larry); 

$sql="SELECT * FROM person"; 

    extract($_POST); 
    if ($name!=NULL){ 
    $exp_arr= array_map('trim', explode(",",$name)); 
    echo var_export($exp_arr); 
    //die; 
     foreach($exp_arr as $val){ 
     $arr = "'%{$val}%'"; 
     $new_arr[] = 'name like '.$arr; 
     } 

     $new_arr = implode(" OR ", $new_arr); 
     echo $sql.=" where ".$new_arr; 
    } 
     else {$sql.="";} 

Echo truy vấn sql như sau: -

SELECT * FROM person where name like '%Tom%' OR name like '%Smith%' OR name like '%Larry%'; 
Các vấn đề liên quan