2009-04-27 6 views
1
選択

内の変数を設定し、このようにエントリを持っている:MySQLは:私の2デシベルのテーブルの別名と加入者を考えると

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, '%') 

、この1は、しかし、複雑なようで、さらに効率的である:

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

は素晴らしい作品どのように効率的にJOINLIKE条件に、感謝を! – Eddy

+0

私がsql言語を扱っていると思うとき、私はほとんどの場合、単音節の言葉で話していることが分かります。最後の方法Quassnoiをありがとう。私は自分の問題を解決する方法を学び、何か新しい、素晴らしい! – Eddy

関連する問題