복합단어 조회 8 516

by 이삐 [MySQL] [2025.04.21 11:58:47]


안녕하세요
조회 쿼리를 짜는데 어려움을 느껴 도움을 요청해봅니다

테이블에 name 컬럼이 있는데 단어1, 단어2, 단어3 등의 데이터가 들어가 있습니다
예를 들어 '단어1단어5단어2' 이렇게 입력하면 해당 데이터가 들어가있는 행 3개가 입력순서대로 조회가 되어야 하는데
조건을 어떻게 줘야 할지 모르겠네요

'단어1단어5단어2' 입력 시 조회결과
name
----------
단어1
단어5
단어2

고수님의 도움을 기다립니다! 감사합니다!

by 마농 [2025.04.21 13:04:51]

조건 입력시 구분자가 필요해 보입니다.
'단어1단어5단어2' 가
'단어1', '단어5', '단어2' 가 될지?
'단어1단', '어5단', '어2' 가 될지? 알 수 없습니다.


by 이삐 [2025.04.21 13:29:23]

네.. 안타깝게도 구분자가 없습니다.
여러 단어를 조합해서 또 하나의 단어를 만드는 거라.. 
구분자가 없으면 많이 복잡해지겠죠?


by Hinori_ [2025.04.21 13:31:32]

구분자가 없다면 사실상 한단어죠..


by 마농 [2025.04.21 13:32:12]

구분자 유무는 쿼리 복잡도에 문제가 되는게 아닙니다.
데이터 정합성에 문제가 됩니다.
검색어가 아닌 다른 단어가 결과에 포함될 수 있습니다.

예를 들면 '아름다운 우리 강산' 3단어 검색하는데
'아름다운우리강산' 으로 검색하면
'아름, '다운', '운우' 등의 엉뚱한 단어가 검색 될 수 있습니다.


by 이삐 [2025.04.21 13:40:09]

일단은 엉뚱한 단어가 나와도 괜찮을 거 같습니다
결과 목록에 찾는 단어가 모두 출력이 된다면요..
나머지는 프론트단에서 처리하면 될 것 같네요~


by 마농 [2025.04.21 13:41:38]
WITH t AS
(
SELECT '단어1' name FROM dual
UNION ALL SELECT '단어2' FROM dual
UNION ALL SELECT '단어5' FROM dual
)
SELECT name
  FROM t
 WHERE    INSTR('단어1단어5단어2', name) > 0
 ORDER BY INSTR('단어1단어5단어2', name), name
;
WITH t AS
(
SELECT '아름다운' name FROM dual
UNION ALL SELECT '우리' FROM dual
UNION ALL SELECT '강산' FROM dual
UNION ALL SELECT '아름' FROM dual
UNION ALL SELECT '다운' FROM dual
UNION ALL SELECT '운우' FROM dual
)
SELECT name
  FROM t
 WHERE    INSTR('아름다운우리강산', name) > 0
 ORDER BY INSTR('아름다운우리강산', name), name
;
WITH t AS
(
SELECT '아름다운' name FROM dual
UNION ALL SELECT '우리' FROM dual
UNION ALL SELECT '강산' FROM dual
UNION ALL SELECT '아름' FROM dual
UNION ALL SELECT '다운' FROM dual
UNION ALL SELECT '운우' FROM dual
)
-- 구분자를 사용한 검색 예시
SELECT name
  FROM t
 WHERE    INSTR(' '|| '아름다운 우리 강산' ||' ', ' '|| name ||' ') > 0
 ORDER BY INSTR(' '|| '아름다운 우리 강산' ||' ', ' '|| name ||' '), name
;

 


by 이삐 [2025.04.21 13:48:53]

감사합니다!!
이렇게 단순하게 되다니 저는 아직 멀었네요 ㅠㅠ


by 마농 [2025.04.21 14:15:11]

아! MySQL 이었네요.

WITH t AS
(
SELECT '아름다운' name
UNION ALL SELECT '우리'
UNION ALL SELECT '강산'
UNION ALL SELECT '아름'
UNION ALL SELECT '다운'
UNION ALL SELECT '운우'
)
-- MySQL 구분자 이용 검색 쿼리
SELECT name
  FROM t
 WHERE    INSTR(CONCAT(' ', '아름다운 우리 강산', ' '), CONCAT(' ', name, ' ')) > 0
 ORDER BY INSTR(CONCAT(' ', '아름다운 우리 강산', ' '), CONCAT(' ', name, ' '))
;