2009-04-27 4 views
1
선택

내에서 변수를 설정 같은 항목이 :MySQL은 : 내 이dB 테이블 별칭과 가입자 감안할 때

aliases.username = '5551234567' 
aliases.contact  = 'sip:[email protected]' 
subscriber.username = 'a_sip_username' 

내가 별칭 내에서 subscriber.username 만 일치하는 행을 선택하고 싶습니다. 연락처 필드. 이것은 내 첫 번째 시도했지만, 그것은 아무것도 반환하지 않습니다

SELECT
aliases.username as phone_number,
(@B:=subscriber.username) as user_name
FROM aliases,subscriber
WHERE aliases.contact regexp "^sip:@B[.*]"

이도 가능 또는 내가 응용 프로그램에 논리를 이동해야합니까? 다음 쿼리를보다 효율적으로 될 것이라고

답변

2
SELECT aliases.username AS phone_number, 
     subscriber.username AS user_name 
FROM aliases, subscriber 
WHERE aliases.contact REGEXP CONCAT('^sip:', subscriber.user_name, '[.*]') 

참고 :

CREATE FUNCTION fn_get_next_subscriber(initial VARCHAR(200)) RETURNS VARCHAR(200) 
NOT DETERMINISTIC 
READS SQL DATA 
BEGIN 
     DECLARE _username VARCHAR(200); 
     DECLARE EXIT HANDLER FOR NOT FOUND RETURN UNHEX('FFFF'); 
     SELECT username 
     INTO _username 
     FROM subscribers 
     WHERE username>= initial 
       AND username NOT LIKE CONCAT(initial, '%') 
     ORDER BY 
       username 
     LIMIT 1; 
     RETURN _username; 
END 

SELECT a.username AS phone_number, 
     s.username AS user_name 
FROM (
     SELECT si.*, CONCAT('sip:', username) AS fromcontact 
     FROM subscriber si 
     ) s, aliases a 
WHERE a.contact >= fromcontact 
     AND a.contact < fn_get_next_subscriber(fromcontact) 

이 인덱스를 사용합니다 :

SELECT aliases.username AS phone_number, 
     subscriber.username AS user_name 
FROM aliases, subscriber 
WHERE aliases.contact LIKE CONCAT('sip:', subscriber.user_name, '%') 

,이 하나,하지만, 훨씬 더 효율적으로 복잡한 것 같다 aliases (contact)에 있고 전체 테이블 스캔을 피하십시오.

내 블로그에이 문서를 참조하십시오 :

+0

큰 작동 방법 JOIN 효율적으로 LIKE 조건, 감사합니다! – Eddy

+0

SQL 언어에 대한 핸들을 가지고 있다고 생각할 때, 나는 대부분의 시간에 모노 음절로 말하는 것을 깨닫게 해줍니다. 마지막 방법 인 Quassnoi를 보내 주셔서 감사합니다. 나는 내 문제와 뭔가 새로운 것을 해결하는 법을 배웠다. – Eddy