1

MySQLメンバーとサブスクライバーに2つのテーブルがあります。私がやりたいのは; 少なくとも1つの期限切れのサブスクリプションがあり、アクティブなサブスクリプションがないサブスクライバーを検索したいと思います。

SELECT mem.id as id 

FROM members as mem 
INNER JOIN subscriptions as sub ON sub.member_id = mem.id 

WHERE 
sub.active = 0 AND 
NOT EXISTS ( SELECT 1 FROM subscriptions as sub2 WHERE sub2.member_id = mem.id AND sub2.active = 1 )

Group By mem.id

このクエリの処理には時間がかかりすぎます(2つのテーブルが保持するレコードの量を考慮すると、これは正常です)。

結果を確認するために約2分待ちましたが、まだロードしようとしていたため、キャンセルしました。より早く結果が必要です。これを行う他の方法はありますか?

お手数をおかけしますが、よろしくお願いいたします。

4

3 に答える 3

1

なぜあなたがこのようにSQLを実行しているのか推測できませんが、これはうまくいくかもしれません

SELECT mem.id as id 
FROM members as mem 
INNER JOIN subscriptions as sub ON sub.member_id = mem.id 
WHERE sub.active = 0 
Group By mem.id

deactivted_date更新:有効期限を示すために列などを追加する可能性があると思います

于 2012-04-10T11:01:33.137 に答える
1

どうぞ。(適切なインデックスがあることを確認してください)。また、元の結合を残したことにも注意してください。これは、ある時点で member_id 以外のものが必要になると想定しているためです。しかし、member_id だけが必要な場合は、members テーブルをまとめて削除できます。

/*
insert members (member_name) values ('tom')
insert members (member_name) values ('bob')
insert members (member_name) values ('jim')

declare @tom int
set @tom = (select member_id from members where member_name = 'tom')

insert subscriptions (member_id, is_active) values (@tom, 1)
insert subscriptions (member_id, is_active) values (@tom, 0)

declare @bob int
set @bob = (select member_id from members where member_name = 'bob')

insert subscriptions (member_id, is_active) values (@bob, 0)
insert subscriptions (member_id, is_active) values (@bob, 0)
*/

SELECT m.member_id
FROM members as m 
INNER JOIN subscriptions as s ON s.member_id = m.member_id 
LEFT JOIN subscriptions s2 on s2.member_id = m.member_id and s2.is_active = 1
WHERE 
s.is_active = 0 and
s2.subscription_id is null

Group By m.member_id

また

SELECT s.member_id
FROM subscriptions as s
LEFT JOIN subscriptions s2 on s2.member_id = s.member_id and s2.is_active = 1
WHERE 
s.is_active = 0 and
s2.subscription_id is null

Group By s.member_id
于 2012-04-10T11:21:08.183 に答える
0

DISTINCT と group by は同じように実行する必要がありますが、DISTINCT を使用するとクエリが読みやすくなります。

アクティブなインデックスは、おそらくクエリを高速化します。

SELECT DISTINCT mem.id as id
FROM members as mem, subscriptions as sub WHERE sub.member_id = mem.id AND 
sub.active = 0 AND NOT EXISTS (
   SELECT * FROM subscriptions as sub2
   WHERE sub2.member_id = mem.id AND sub2.active = 1
)
于 2012-04-10T13:22:56.670 に答える