mysql - 获取xxxx年未缴费成员(member)列表

标签 mysql sql

我正在尝试为客户制作一个管理面板,但我的 SQL 查询遇到了一些问题。

我想要做的是,显示一个页面,其中包含所有支付了 xxxx 年(例如:2018 年)费用的成员(member)的数据表。并为他添加一个小选择按钮,以筛选在 xxxx 年付款的成员(member)和未付款的成员(member)。

成员的表模式很简单:

id
first_name
last_name
email
number
active

至于支付逻辑,我把年费和支付分成了两个单独的表。

付款:

member_id
year_id
notes
paid
paid_at
created_at
updated_at

年费:

id
year
amount
created_at
updated_at

获取付费用户非常简单。我加入了三个表并选择了与他指定的年份匹配的行:

SELECT `payments`.`id` AS `paymentID`,
       `payments`.`notes`, `payments`.`paid_at`, 
       `members`.`first_name`, `members`.`last_name`, 
       `members`.`id` AS `memberID`, `payments`.`paid`, 
       `yearly_fees`.`year`, 
       FORMAT(yearly_fees.amount, 0) AS yearlyAmount 
FROM `members` 
    INNER JOIN `payments` 
        ON `payments`.`member_id` = `members`.`id` 
    INNER JOIN `yearly_fees`
        ON `yearly_fees`.`id` = `payments`.`year_id` 
WHERE `payments`.`year_id` = ?

但现在我在处理未付款的用户列表时遇到了麻烦。我会尽力举例说明具体情况,但如果我未能尽可能清楚地说明,我会提前致歉,因为这是我第一次做这样的事情。

假设我们的表中有三个成员。 John DoeJane DoeJoe Bloggs。 Jane 和 Joe 已经支付了 2018 年的成员(member)费,他们的数据可以在支付页面中看到。如果管理员单击 unpaid 过滤器,他会看到 John Doe 是唯一一个没有付款的人。但明天是 2019 年,现在管理员已经为 2019 年开立了新的年费。现在如果他想过滤未付的费用,他应该获得 John、Jane 和 Joe 的列表。

我面临的问题是,如果 John 支付了 2018 年的费用而不是 2019 年的费用,则 SQL 查询不会与其他未付费成员(member)一起获取他的名字,因为它认为他确实支付了费用。而且无论我做什么,我似乎都无法找到正确的工作逻辑。我不知道是不是因为我写错了查询,或者我做错了模式,还是我应该制作另一个表来处理这种类型的逻辑。

我尝试使用的 SQL 查询如下:

SELECT `members`.`id` AS `memberID`, 
       `members`.`first_name`, 
       `members`.`last_name` 
FROM `members` 
    LEFT JOIN `payments` 
        ON `payments`.`member_id` = `members`.`id`
    LEFT JOIN `yearly_fees` 
        ON `yearly_fees`.`id` = `payments`.`year_id` 
WHERE `payments`.`member_id` IS NULL

2019 年的结果是这样的:

Jane Doe,Joe Bloggs

它没有得到 John Doe,因为 John 支付了前一年的费用,并且查询认为他也支付了这一年的费用。

我希望我相应地解释了我的问题,如果您需要更多说明,请告诉我。

最佳答案

您需要在查询中指定您感兴趣的 year_id。加入 payments 时,它必须进入 ON 子句。

SELECT `members`.`id` AS `memberID`, 
       `members`.`first_name`, 
       `members`.`last_name` 
FROM `members` 
LEFT JOIN `payments` 
    ON `payments`.`member_id` = `members`.`id` AND payments.year_id = ?
WHERE payments.id IS NULL

DEMO

关于mysql - 获取xxxx年未缴费成员(member)列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53199271/

相关文章:

mysql - 复杂的 MySQL 删除查询

MySQL文件导入

php - 错误: Call to undefined function SUM()

php - 错误注册表 21

mysql - 如何在执行多个联接时从单个表中进行计数

mysql - 乘客表中有大量冗余

php - 如何计算一个字段中的日期时间

c# - 将按位枚举映射到 sql 列值

MySQL 的 HEX() 和 UNHEX() 等同于 Postgres?

c# - 通过 SQL 将属性存储在 Arraylist 中并显示在文本框中