2010-06-26 3 views
2

그래서 1 ;; 2;와 같은 형식의 데이터가 있습니다. 그런 다음이 숫자를 쿼리에 사용해야하므로 1,2로 변환하고 IN 조건에서 사용한다고 생각했습니다. 내 테이블에서 결과는 2 행을 리턴해야하지만 대신 1 행만 리턴합니다.하위 쿼리를 대체 할 MySQL을 선택하십시오.

내 검색어는 다음과 같습니다. 문제가 없지만 1 행만있는 부속 조회 리턴은 검색됩니다.

select * 
from wt_lists 
where id IN ((select replace (replace(sendto, ';;',','),';','') 
       from wt_stats where statsid IN (1))) 

하지만이 함께 할 때. 그것은 내 경우에는 2 행 올바른 결과를 반환합니다.

select * 
    from wt_lists 
where id IN (1,2) 

무엇이 여기에 있습니까?

';1;;2;'

하려면 :

+0

귀하의 하위 쿼리 ... 문자열 "1, 2", ID 1 및 2없는 두 개의 행을 반환하면 '(CAST를 선택 할 때 1,2 'AS UNSIGNED)라면 1 – simendsjo

+1

을 얻을 수 있습니다. 가능한 경우 응용 프로그램 논리에서 데이터를 구문 분석하고 쉼표로 구분 된 문자열을 MySQL에 보내십시오. –

+0

David에 동의합니다. MySQL에서이 작업을 수행하는 것이 지저분 해 보입니다. 이 저장 프로 시저를 발견 : http://forge.mysql.com/tools/tool.php?id=4 – simendsjo

답변

3

IN 절에 사용하기 위해 쉼표로 구분 된 문자열을 쿼리에 명시 적으로 정의해야합니다. 사용자가 쉼표로 구분 된 사용자 입력 문자열을 통합하기 위해 동적 SQL을 사용해야하는 곳은 수많은 예제가 있습니다.

은 내가 사용하는 솔루션을 말했다 있다는 FIND_IN_SET function :

SELECT DISTINCT wl.* 
    FROM WT_LISTS wl 
    JOIN (SELECT REPLACE(REPLACE(ws.sendto, ';;',','),';','') AS ids 
      FROM WT_STATS ws 
     WHERE ws.statsid = 1) x ON FIND_IN_SET(wl.id, x.ids) > 0 
1

당신은 문자열을 교체하는 서로 다른 값을 선택해야합니다

 
select * from wt_lists where id IN ('1,2') from wt_stats where statsid IN (1) 

절에서 사용하려면 다음과 같은

'1,2'

그래서, 당신은 SQL 쿼리가 보인다 다른 행에.

나는 당신이 필요로하는 바로이 저장 프로 시저를 발견했습니다.

http://kedar.nitty-witty.com/blog/mysql-stored-procedure-split-delimited-string-into-rows/

내가 테스트하지 않은,하지만이 방법입니다.

Obs : 위의 설명에서 David의 말처럼 응용 프로그램에서 데이터를 구문 분석하는 것이 더 나은 방법입니다.

관련 문제