WHERE 절에서 mysql concat()을 사용하고 있습니까?
테이블에서 이름 열과 성 열로 검색하려고 합니다.현재 필드의 검색어를 수락하고 두 열과 한 번에 하나씩 비교합니다.
select * from table where first_name like '%$search_term%' or
last_name like '%$search_term%';
이것은 단일 단어 검색어로 올바르게 작동하지만 결과 세트에는 "Larry"라는 이름을 가진 모든 사용자가 포함됩니다.하지만 만약 누군가가 이름 뒤에 공백, 그리고 성을 입력한다면, 나는 더 좁은 검색 결과를 원합니다.나는 다음을 시도했지만 성공하지 못했다.
select * from table where first_name like '%$search_term%' or last_name
like '%$search_term%' or concat_ws(' ',first_name,last_name)
like '%$search_term%';
조언 좀 해주시겠어요?
EDIT: 테스트하는 이름은 "래리 스미스"입니다.DB는 "first_name" 열에 "Larry"를 저장하고 "last_name" 열에 "Smith"를 저장합니다.데이터는 깨끗하고 공백이 없으며 검색어는 왼쪽과 오른쪽으로 잘립니다.
편집 2: 나는 오늘 아침에 로버트 갬블의 대답을 시도했다.그의 것은 내가 어젯밤에 뛰던 것과 매우 유사하다.설명할 수는 없지만, 오늘 아침에는 효과가 있어요.유일하게 생각할 수 있는 차이점은 어젯밤 concat 함수를 검색 쿼리의 세 번째 "또는" 세그먼트로 실행했다는 것입니다(first_name과 last_name을 살펴본 후).오늘 아침, 상기와 주소, 업소명을 조사해 마지막 세그먼트로 실행했습니다.
쿼리 끝에 mysql 함수를 실행하면 중간보다 더 잘 작동합니까?
현재 가지고 있는 것은 기능해야 하지만 다음과 같이 줄일 수 있습니다.
select * from table where concat_ws(' ',first_name,last_name)
like '%$search_term%';
이 기능이 작동하지 않는 예시와 검색어를 제공해주실 수 있습니까?
검색 쿼리는 대소문자를 구분합니다.
사용시
SELECT * FROM table WHERE `first_name` LIKE '%$search_term%'
그것은 "래리"와 "래리"에 모두 어울릴 것이다.이 concat_ws에서는 갑자기 대소문자가 구분됩니다!
이 문제는 다음 쿼리를 사용하여 해결할 수 있습니다.
SELECT * FROM table WHERE UPPER(CONCAT_WS(' ', `first_name`, `last_name`) LIKE UPPER('%$search_term%')
편집: 이 기능은 바이너리가 아닌 요소에서만 작동합니다.mynameispaulie의 답변도 참조하십시오.
SELECT *,concat_ws(' ',first_name,last_name) AS whole_name FROM users HAVING whole_name LIKE '%$search_term%'
...당신이 원하는 걸지도 몰라요.
Luc 앞으로:
당신의 답변에 동의합니다만, UPER는 비바이너리 요소에서만 작동한다는 것을 덧붙이고 싶습니다.AGE 열(또는 숫자)을 사용하는 경우, UPER 기능이 올바르게 작동하려면 CAST 변환을 수행해야 합니다.
SELECT * FROM table WHERE UPPER(CONCAT_WS(' ', first_name, last_name, CAST(age AS CHAR)) LIKE UPPER('%$search_term%');
Luc의 대답에 직접 대답하지 않은 것을 용서하십시오. 하지만 아무리 생각해도 어떻게 대답해야 할지 알 수가 없었습니다.관리자가 제 글을 옮길 수 있다면 옮겨주세요.
(mysql에서 작업) 다른 SQL도 가능합니다.이것만 시험해 보세요.
select * from table where concat(' ',first_name,last_name)
like '%$search_term%';
방해가 될 수 있는 몇 가지 사항이 있습니다. 데이터가 깨끗한가요?
이름 필드의 끝에 공백이 있을 수 있습니다.즉, 이름과 성 사이에 공백이 2개 있는 경우가 있습니다.trim(first_name)/trim(last_name)을 사용하면 이 문제가 해결되지만, 실제 수정은 데이터를 업데이트하는 것입니다.
또한 두 단어가 모두 발생하지만 반드시 함께 발생하지는 않는 곳에 일치시킬 수도 있습니다($search_term 변수가 시사하는 php에 있다고 가정함).
$whereclauses=array();
$terms = explode(' ', $search_term);
foreach ($terms as $term) {
$term = mysql_real_escape_string($term);
$whereclauses[] = "CONCAT(first_name, ' ', last_name) LIKE '%$term%'";
}
$sql = "select * from table where";
$sql .= implode(' and ', $whereclauses);
다음과 같이 시험해 보십시오.
select * FROM table where (concat(first_name, ' ', last_name)) = $search_term;
언급URL : https://stackoverflow.com/questions/303679/using-mysql-concat-in-where-clause
'programing' 카테고리의 다른 글
PyLint 메시지: logging-format-interpolation (0) | 2023.01.15 |
---|---|
Java에서 문자열을 곱하여 시퀀스를 반복할 수 있습니까? (0) | 2023.01.15 |
Matplotlib tight_layout()은 그림 suptitle을 고려하지 않습니다. (0) | 2023.01.15 |
Javascript에서 배열에서 빈 요소 제거 (0) | 2023.01.15 |
vuejs - 메서드를 통해 계산된 속성 변경 (0) | 2023.01.15 |