programing

mySQL의 전체 테이블에서 문자열 검색

cafebook 2023. 9. 15. 21:19
반응형

mySQL의 전체 테이블에서 문자열 검색

SQL의 전체 테이블에서 문자열을 검색하려고 합니다.

테이블의 모든 필드와 모든 항목을 검색하여 지정된 텍스트가 포함된 각 전체 항목을 반환합니다.

여러 필드를 쉽게 검색하는 방법을 알 수 없습니다. 자세한 내용은 다음과 같습니다.

테이블은 "클라이언트"입니다.약 30개의 필드와 800개의 엔트리를 가지고 있어 브라우저에서 한 번에 모두 보여주기에는 너무 많습니다.이름(즉, "Mary")을 검색하고 싶지만, 이름에 있을 수 있습니다.shipping_name field아니면billing_name field, 아니면email밭 등

모든 필드에서 "Mary" 문자열이 포함된 항목을 검색하고 싶습니다.이것이 제가 생각하기에 효과가 있어야 하지만 그렇지 않습니다.

SELECT * FROM `clients` IN 'Mary'

다음과 같은 것을 시도해 보십시오.

SELECT * FROM clients WHERE CONCAT(field1, '', field2, '', fieldn) LIKE "%Mary%"

문자열 연산자 및 정규식에 대한 추가 정보는 SQL 문서를 참조할 수 있습니다.

편집: NULL 필드에 문제가 있을 수 있으므로 사용을 원할 경우를 대비하여IFNULL(field_i, '')만이 아니라field_i

대소문자 구분:대소문자를 구분하지 않는 대조 등을 사용할 수 있습니다.

... WHERE LOWER(CONCAT(...)) LIKE LOWER("%Mary%")

그냥 모든 필드 검색하기: 검색할 필드를 명시적으로 선언하지 않고 모든 필드를 검색할 SQL 쿼리를 만들 방법은 없다고 생각합니다.그 이유는 관계형 데이터베이스 이론과 관계형 데이터를 조작하는 엄격한 규칙(관계형 대수나 codd 대수 같은 것들, 이것들이 SQL에서 유래된 것들)이 있고, 이론은 "모든 필드를 검색할 뿐"과 같은 것들을 허용하지 않기 때문입니다.물론 실제 행동은 공급업체의 구체적인 실현 여부에 달려 있습니다.하지만 보통은 불가능합니다.확인하기 위해 확인합니다.SELECT연산자 구문(WHERE정확히 말하면 섹션).

검색과 관련될 수 있는 모든 필드를 식별한 다음 다음과 같은 쿼리를 사용합니다.

SELECT * FROM clients
WHERE field1 LIKE '%Mary%'
   OR field2 LIKE '%Mary%'
   OR field3 LIKE '%Mary%'
   OR field4 LIKE '%Mary%'
   ....
   (do that for each field you want to check)

사용.LIKE '%Mary%'대신에= 'Mary'에서 일부 캐릭터 + '메리' + 일부 캐릭터가 포함된 필드를 찾습니다.

'좋아요' 키워드와 패턴 매칭 에도.아래와 같이 전체 텍스트 기능을 사용하여 검색을 수행할 수도 있습니다.

SELECT * FROM clients WHERE MATCH (shipping_name, billing_name, email) AGAINST ('mary')

일부 텍스트만 찾고 프로그래밍 목적으로 결과 집합이 필요 없는 경우 HeidiSQL을 무료로 설치할 수 있습니다(v9.2.0.4947을 사용하고 있습니다).

데이터베이스 또는 테이블에서 마우스 오른쪽 단추를 누른 후 "서버에서 텍스트 찾기"를 선택합니다.

모든 매치는 테이블별로 별도의 탭에 표시됩니다. 아주 좋습니다.

무서울 정도로 유용했고 시간을 절약했습니다.너무 긴 질문은 잊어버려요!!

전체 테이블 검색을 위한 PHP 기반 솔루션! 검색 문자열은 $string입니다.일반적이며 필드 수에 상관없이 모든 테이블에서 작동합니다.

$sql="SELECT * from client_wireless";
$sql_query=mysql_query($sql);
$logicStr="WHERE ";
$count=mysql_num_fields($sql_query);
for($i=0 ; $i < mysql_num_fields($sql_query) ; $i++){
 if($i == ($count-1) )
$logicStr=$logicStr."".mysql_field_name($sql_query,$i)." LIKE '%".$string."%' ";
else
$logicStr=$logicStr."".mysql_field_name($sql_query,$i)." LIKE '%".$string."%' OR ";
}
// start the search in all the fields and when a match is found, go on printing it .
$sql="SELECT * from client_wireless ".$logicStr;
//echo $sql;
$query=mysql_query($sql);

이 코드를 사용해 보세요.

SELECT 
       * 
FROM 
       `customers` 
WHERE 
       (
          CONVERT 
               (`customer_code` USING utf8mb4) LIKE '%Mary%' 
          OR 
          CONVERT(`customer_name` USING utf8mb4) LIKE '%Mary%' 
          OR 
          CONVERT(`email_id` USING utf8mb4) LIKE '%Mary%' 
          OR 
          CONVERT(`address1` USING utf8mb4) LIKE '%Mary%' 
          OR
          CONVERT(`report_sorting` USING utf8mb4) LIKE '%Mary%'
       )

이것은 당신의 문제를 해결하는데 도움이 됩니다 mysql version 5.7.21.

써브라임을 사용하는 경우 텍스트 패스트리를 사용하여 여러 줄 선택 및 Emmet과 함께 수백 또는 수천 줄을 쉽게 생성할 수 있습니다.

제 html로 , 에는 을 html 합니다 에는 div*249의 빈 을 이 249 를 의 를 이 을 런음중을여다다여을n런d중음i을 입력했습니다.col_id_텍스트 패스트리를 트리거하여 증분 ID 번호를 삽입합니다. 다시 런음러번면할수다시ee수n을 삭제할 수 있습니다.div마크업하고 MySQL 구문으로 대체합니다.

특정 요구사항에 대해서는 다음이 검색에 적합합니다.

select * from table_name where (column_name1='%var1%' or column_name2='var2' or column_name='%var3%') and column_name='var';

데이터베이스에서 데이터를 검색하기 위해 쿼리하려면 이 작업이 완벽하게 수행됩니다.

테이블을 엑셀 시트로 내보내고 엑셀 파일 자체에서 문자열을 찾을 수 있습니다.

이 방법은 최선의 방법이 아니며 많은 양의 테이블과 데이터로 db가 충돌할 수 있으므로 주의하여 사용해야 합니다.특정 설정에서 사용하려면 수정해야 할 사항이 있지만, 이를 통해 사용자에게 접근할 수 있습니다.

<?php 

class DBSearch{

// DB Connection
protected $db;

// Name of the DB to search in
protected $db_name = 'my_db_name';

// Tables to exclude from search
protected $excluded_tables = array(
    'TABLE_I_DONT_WANT_INCLUDED',
);

// Search String 
protected $search_string = '';

// Table has column
protected $has_column = '';

// Set the result limit per query
protected $limit = 5;

public function __construct($db_conn) {
    parent::__construct();
    $this->db = $db_conn;
}

public function search(string $search_str, string $has_column, array $exclude_table){

    $this->search_string = $search_str;
    $this->has_column = $has_column;
    $this->excluded_tables = $exclude_table;
    
    if(!empty($this->has_column)){
      $table_names = $this->get_table_with_column($this->has_column,$this->excluded_tables);
    }else{
      $table_names = $this->get_all_tables($this->excluded_tables);  
    }
    
    $query_string = $this->generate_query_string($table_names, $this->search_string);

    $results = array();
    foreach($query_string as $k=>$v){
        $query = $v.' LIMIT '.$this->limit;
        $results[] = $this->db->query($query)->result();
    }

    return $results;
}
/**
 * Returns the column names associated with the table
 * provided by the $table param
 *
 * @param string $table
 * @return array
 */
private function get_table_column_names($table){

    $response = array();

    $sql = 'SELECT COLUMN_NAME, TABLE_NAME
            FROM information_schema.columns
            WHERE table_schema = ?
            AND table_name = ?
            ORDER BY table_name, ordinal_position';
    $param = array($this->db_name, $table);
    $result = $this->db->query($sql, $param);
    if($result->num_rows() >= 1){
        foreach ($result->result() as $v){
            $response[$table][] = $v->COLUMN_NAME;
        }
    }
    return $response;
}
/**
 * Returns a object contaning the table names that
 * have columns that have the name provided in $column
 *
 * You can also pass in a string or an array of tables not to in clude in
 * the result set using the $exclude_table param
 *
 * @param string $column
 * @param array|string $exclude_table
 * @return object|boolean
 */
private function get_table_with_column($column, $exclude_table=NULL){

    $sql = 'SELECT table_name
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE (COLUMN_NAME = ?
            OR COLUMN_NAME LIKE ?)
            AND table_schema = ? ';

    if(NULL !== $exclude_table){
        if(is_array($exclude_table)){
            foreach($exclude_table as $v){
                $sql .= ' AND TABLE_NAME != "'.strip_quotes($v).'"';
            }
        }

        if(is_string($exclude_table)){
            $sql .= ' AND TABLE_NAME != "'.strip_quotes($exclude_table).'"';
        }
    }

    $sql .= ' GROUP BY TABLE_NAME ORDER BY TABLE_NAME ';

    $query_param = array($column, '%'.$column.'%', $this->db_name);

    $result = $this->db->query($sql, $query_param);
    if($result->num_rows() >= 1){
        return $result->result();
    }
    return false;
}
/**
 * Returns an object contaning the table names.
 *
 * You can also pass in a string or an array of tables not to in clude in
 * the result set using the $exclude_table param
 *
 * @param array|string $exclude_table
 * @return object|boolean
 */
private function get_all_tables($exclude_table=NULL){

    $sql = 'SELECT table_name
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE table_schema = ? ';

    if(NULL !== $exclude_table){
        if(is_array($exclude_table)){
            foreach($exclude_table as $v){
                $sql .= ' AND TABLE_NAME != "'.strip_quotes($v).'"';
            }
        }

        if(is_string($exclude_table)){
            $sql .= ' AND TABLE_NAME != "'.strip_quotes($exclude_table).'"';
        }
    }

    $sql .= ' ORDER BY TABLE_NAME';

    $query_param = array($this->db_name);

    $result = $this->db->query($sql, $query_param);
    if($result->num_rows() >= 1){
        return $result->result();
    }
    return false;
}
/**
 * Generates a search string for each table 
 * provided $table_names array
 * 
 * @param array $table_names
 * @param string $search_string
 * @return array[]
 */
private function generate_query_string($table_names, $search_string){

    $search_split = explode(' ', $search_string);
    $search_a = isset($search_split[0]) ? $search_split[0]:'';
    $search_b = isset($search_split[1]) ? $search_split[1]:'';

    $queries = array();
    if(is_array($table_names)){
        foreach ($table_names as $v){

            $query_string = 'SELECT * FROM '.$v->TABLE_NAME.' WHERE (';
            
            foreach ($this->get_table_column_names($v->TABLE_NAME)[$v->TABLE_NAME] as $c){
                $query_string .= '`'.$c.'` LIKE "%'.$search_string.'%" OR';
                if(!empty($search_a)){
                    $query_string .= '`'.$c.'` LIKE "%'.$search_a.'%" OR';
                }
                if(!empty($search_b)){
                    $query_string .= '`'.$c.'` LIKE "%'.$search_b.'%" OR';
                }
            }

            // Remoe Last OR
            $query_string = substr($query_string, 0, strlen($query_string)-3). ')';
            $queries[$v->TABLE_NAME] = $query_string;
        }
    }
    return $queries;
}

}

// USEAGE
$search = new DBSearch($db_conn);
$exclude_table = array(
     'tables',
     'i_dont',
     'want_searched'
);
$search->search('Something to search for', 'has_this_column',   $exclude_table);

이 필수 항목은 데이터베이스 테이블에 대한 쿼리 작성기이며 DB에 있는 각 테이블/열에서 쿼리를 실행합니다.아마 도움이 될 겁니다.맛있게 드세요.

언급URL : https://stackoverflow.com/questions/11939751/search-a-whole-table-in-mysql-for-a-string

반응형