2009-04-27 52 views
1

由於我的兩個數據庫表的別名和用戶設置變量有條目是這樣的:MySQL的:內選擇

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, '[.*]') 

請注意,下面的查詢效率會更高:

SELECT aliases.username AS phone_number, 
     subscriber.username AS user_name 
FROM aliases, subscriber 
WHERE aliases.contact LIKE 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) 

這將使用索引在aliases (contact)並避免全表掃描。

看到這篇文章在我的博客:

+0

如何JOIN有效地對LIKE條件偉大的作品,謝謝! – Eddy 2009-04-27 15:52:53