我有一个用于存储用户的表和一个用于存储会员费用的表:
用户
MemberFeePayments
"用户" MemberFeePayment中的列是已支付费用的用户的引用(外键)。 "年"列告诉用户哪一年支付了费用。如果用户已成为成员多年,则MemberFeePayments表中的用户将有多行。
现在我想编写一个提取所有用户的SQL查询。生成的表应该有一个列,告诉用户是否是特定年份的成员(将提供给查询):
结果
实现这一目标的好方法是什么?
我正在使用MySql(5.6)。
答案 0 :(得分:2)
如果每年只有一个费用付款记录,这应该有效:
SELECT
U.Id, U.Name,
CASE WHEN M.ID IS NULL THEN 0 ELSE 1 END AS `IsMember`
FROM Users U
LEFT JOIN MemberFeePayments M ON (U.Id = M.User AND M.Year = 2013)
如果您在一年中有多笔付款,这将有效:
SELECT
U.Id, U.Name,
CASE WHEN COUNT(M.ID) > 0 THEN 1 ELSE 0 END AS `IsMember`
FROM Users U
LEFT JOIN MemberFeePayments M ON (U.Id = M.User AND M.Year = 2013)
GROUP BY U.Id, U.Name;
答案 1 :(得分:1)
这是一种可以做到的方法。因此,它会点亮所有用户,无论他们是否在MemberFeePayments表中,如果他们是特定年份的成员,则会显示“是”。
select
x.Id,
x.Name,
case when x.member is not null then 'Yes' else 'No' end as IsMember
from
(
select
u.Id,
u.Name,
m.User as member
from Users u
left join MemberFeePayments m on m.User = u.Id AND m.year = 2014
)x
或者如下所示,不从派生表中进行外部选择。
select
u.Id,
u.Name,
case when m.User IS NOT NULL THEN 'Yes' else 'No' end as IsMember
from Users u
left join MemberFeePayments m on m.User = u.Id AND m.year = 2014
答案 2 :(得分:1)
试试这个:
SELECT a.Id,a.Name,if(b.id>0,TRUE,FALSE) as ismember FROM USERS a LEFT JOIN MemberFeepayments b ON a.id=b.id
检查列字段和表名
答案 3 :(得分:-1)
使用left join
SELECT t1.id,t1.Name,t2.id
FROM Users t1
LEFT JOIN MemberFeePayments t2 ON t1.id = t2.user and t2.year = 2014
如果该用户和年份的t2.id
中没有数据,则 MemberFeePayments
将为空