MySQL选择唯一记录

3

我有以下查询:

select * from members,subscriptions
where members.MemberID = subscriptions.MemberID
and subscriptions.Year = 2009
and members.ASSCID = 15
and subscriptions.Untildate between '$2009-01-01' and '2009-12-31'
order by members.Memberlastname

会员可以选择一次性缴纳年度会费(年度订阅),或者分两次缴纳,一次在一月份,一次在六月份(半年订阅)。我想获取至少缴纳过一次会费的会员。

上述陈述将带来一些会员两次(那些在一月和六月都付款的人)。

是否可能获取至少缴纳过一次会费的会员(无论他们是缴纳了年度订阅还是半年订阅),并避免重复。

3个回答

2

编辑后的答案

您可以在订阅中进行exists操作,以查找在给定年份至少支付一次的会员:

select * from members
where  members.ASSCID = 15 and   
exists (select 1 from subscriptions  
where members.MemberID = subscriptions.MemberID   
and subscriptions.Year = 2009   

) 
order by members.Memberlastname

year 用于指定会员缴费的年份。他们可能在2007年为2006年或2005年缴费。 - tsiger

2

使用SELECT DISTINCT,这将仅获取您选择的列的唯一值。


请查看这篇SO帖子“Group By和Distinct之间有什么区别”https://dev59.com/rXVC5IYBdhLWcg3w2lCI - Adrian
@Adrian 谢谢你,我以前从未想过那个。 - Francis Upton IV

1

从会员表中选择所有至少有一个订阅的会员记录:

select members.*
from members join
(
   select
   members.MemberID, count(*)
   from members join subscriptions on (members.MemberID = subscriptions.MemberID)
   where subscriptions.Year = 2009
   and subscriptions.Untildate between '2009-01-01' and '2009-12-31'
   group by members.MemberID 
   having count(*) >= 1
)
v on ( members.MemberID = v.MemberID)
where members.ASSCID = 15

不确定关于“having count(*)>1” - 那不会排除只付款一次的人吗? - Francis Upton IV
我在我的语句中使用了select *,因为我想在表格中显示记录。我是否需要分别选择每个字段,例如members.MemberID? - tsiger
@Gerasimos,您可以在GROUP BY列表中包含成员表中的所有所需字段,或者在MemberID(我假设是主键)上重新加入成员表。 - Adrian
请考虑 Steve De Caux 的解决方案,它使用了“exists” - 这可能会更高效。 - Adrian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接