2015-10-23 27 views
0

我想从数据库中导出订户列表,而我的SQL调用工作时,它缺少一些逻辑。我的问题是 - 我想导出用户过期的会员。某些用户可能同时拥有过期的会员资格和活动会员资格。我不希望这些用户在我的名单上。MySQL查询过滤只从表中过期的用户

我在想我需要一个子查询来过滤用户过期和活跃的成员资格,但我不知道如何。

这里是我当前的查询:

SELECT 
jos_users.name, 
jos_users.email, 
jos_users.username, 
jos_payplans_subscription.expiration_date, 
jos_payplans_subscription.status, 
jos_payplans_subscription.total, 
jos_payplans_subscription.subscription_id 
FROM jos_payplans_subscription 
LEFT JOIN jos_users ON jos_payplans_subscription.user_id = jos_users.id 
LEFT JOIN jos_payplans_user ON jos_payplans_user.user_id = jos_users.id 
WHERE (jos_payplans_subscription.expiration_date BETWEEN '2015-09-01 00:00:00' AND '2015-10-31 00:00:00') 

我感谢所有帮助。

感谢:-)

+0

jos_payplans_subscription.status没有确定它们是否处于活动状态,过期状态等的标志吗? – Hexana

+0

是的,但仅适用于当前的会员。用户可以拥有多个成员资格,我只需要查找那些过期会员资格并且没有活动会员资格的用户。 – Dyvel

+0

您是否更容易更改架构?例如,用户可以拥有1个或更多成员资格,并且成员资格可以具有1个或更多状态(活动或不活动)。因此,在用户和成员身份之间创建一个名为“membershipStatus”的多对多关系,其中具有用户ID,会员ID和成员资格状态的组合PK?这会给你一个简单的查询 – Hexana

回答

1

您可以加入回订阅表查找活动的潜艇,而忽略那些:

select q.name, q.email, q.username, q.expiration_date, q.status, q.total, q.subscription_id 
from (
    SELECT 
    jos_users.name, 
    jos_users.email, 
    jos_users.username, 
    jos_payplans_subscription.expiration_date, 
    jos_payplans_subscription.status, 
    jos_payplans_subscription.total, 
    jos_payplans_subscription.subscription_id 
    FROM jos_payplans_subscription 
    LEFT JOIN jos_users ON jos_payplans_subscription.user_id = jos_users.id 
    LEFT JOIN jos_payplans_user ON jos_payplans_user.user_id = jos_users.id 
    WHERE (jos_payplans_subscription.expiration_date BETWEEN '2015-09-01 00:00:00' AND '2015-10-31 00:00:00') 
) q 
join jos_payplans_subscription s on s.user_id = q.user_id 
group by q.name, q.email, q.username, q.expiration_date, q.status, q.total, q.subscription_id 
having min(s.expiration_date) is not null; 

编辑:忘记了

having min(s.expiration_date) not null 

having min(s.expiration_date) is not null 
+0

谢谢你的努力 - 但我不能让mysql接受最后一行 - NOT NULL部分 - 在此引发错误。如果我删除“不为空”,我得到的用户数量与我在初始查询中的数量相同? – Dyvel

+0

轻微的语法错误,应该是'不为空'。 – JRD

+0

谢谢 - 这是诀窍! :-)我现在是一个快乐的露营者 – Dyvel

0

我之前做过的类似的事情是在用户和会员表之间创建一个名为“activeMembership”的联结表。这不得不用户ID和membershipID的复合PK和一个名为“membershipSatus”

然后,你可以很容易地做到柱:

SELECT username, email, membershipType, membershipStatus FROM 
activeMembership 
JOIN users on users.userID = activeMembership.userID 
JOIN membership ON membership.membershipID = activeMembership.membershipID 
WHERE membershipStatus='Inactive'; 

也许改变模式并创建一个多对多的关系就解决问题了吗?