2012-06-11 1 views
0

MySQL을 사용하여 세션 변수가 IN 절과 어떻게 작동하는지 알고 싶습니다.MySQL을 사용하여 IN 절을 사용하여 세션 변수 작업하는 방법?

나 자신을 시도했지만 성공하지 못했습니다.

SET @concat_var := (SELECT GROUP_CONCAT(player_id) FROM tableB where id = 1); 
// result 88,89 
SELECT @concat_var; 
SELECT player_id FROM tableA WHERE player_id IN (@concat_var); 

쿼리 출력 세션 변수

쿼리 (정확하지)

player_id 
88 

(는 결과가 필요)

player_id 
88 
89 

답변

2

FIND_IN_SET()

SET @concat_var := (SELECT GROUP_CONCAT(player_id) FROM tableB where id = 1); 
SELECT @concat_var; 
SELECT player_id FROM tableA WHERE FIND_IN_SET(player_id,@concat_var); 
0

지금까지 내가, 그것을 알고 불가능합니다 (편집 : @concat_var의 값이 실제로 단일 문자열이기 때문에 @QueryMaster가 MySQL 독점 확장을 사용하여 실제로 가능하다는 것을 보여줍니다. 따라서 마지막 쿼리 실제로는 SELECT player_id FROM tableA WHERE player_id IN ('88,89')과 같습니다 (MySQL은 '88,89'을 캐릭터 라인의 정수 접두사를 구문 분석 해, 수치 컨텍스트에 강제적으로 캐스트합니다. 따라서 88).

는 다음을 수행 할 수 있어야하지만 (이 하위 쿼리를 포함하지 않는 한, 더 나은 수행 할 수)

SELECT player_id 
FROM tableA 
WHERE player_id IN (
    SELECT player_id 
    FROM tableB 
    WHERE id = 1 
) 

또는 거의 동등한 :

SELECT player_id 
FROM tableA 
JOIN tableB USING (player_id) 
WHERE tableB.id = 1 
+1

당신이 FIND_IN_SET() ..... –

+0

@QueryMaster 아주 좋은 지적에 대해 어떻게 생각하십니까이 질문의 대답입니다 :

대신 조인을 사용해야합니다 . 나는 그것에 대해 몰랐다. 그것은 표준 SQL (내 솔루션이 아니지만), 일을 할거야 정확히 OP가 무엇을 요구하는 일이. – Romain

0

@concat_var이 포함되어 있습니다 문자열 '88,89'. 따라서 :

SELECT player_id FROM tableA WHERE player_id IN (@concat_var); 

실적 :

SELECT player_id FROM tableA WHERE player_id IN (88.0); 

따라서 이것을 : player_id 이후

SELECT player_id FROM tableA WHERE player_id IN ('88,89'); 

가되는 정수형 MySQL은 comparingplayer_id하여 쿼리와 부동 소수점 수와 문자열을 수행 당신이보고 한 잘못된 결과를 보는 이유입니다.

SELECT player_id FROM tableA JOIN tableB USING (player_id) WHERE tableB.id = 1; 
+0

FIND_IN_SET()에 대해 어떻게 생각하십니까 –

+0

@QueryMaster : 여기에서 사용할 수 있지만 조인이 더 적절합니다. – eggyal

관련 문제