在SQL查询中创建新列

时间:2014-05-22 09:27:29

标签: mysql sql

我有一个用于存储用户的表和一个用于存储会员费用的表:

用户

  • Id(int)
  • 姓名(字符串)

MemberFeePayments

  • Id(int)
  • 用户(int)
  • 年(int)

"用户" MemberFeePayment中的列是已支付费用的用户的引用(外键)。 "年"列告诉用户哪一年支付了费用。如果用户已成为成员多年,则MemberFeePayments表中的用户将有多行。

现在我想编写一个提取所有用户的SQL查询。生成的表应该有一个列,告诉用户是否是特定年份的成员(将提供给查询):

结果

  • Id(int)
  • 姓名(字符串)
  • IsMember(bool)

实现这一目标的好方法是什么?

我正在使用MySql(5.6)。

4 个答案:

答案 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;

Here's a link to a demo

答案 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 

DEMO

答案 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将为空