我正在尝试为客户制作一个管理面板,但我的 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 Doe
、Jane Doe
、Joe 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
关于mysql - 获取xxxx年未缴费成员(member)列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53199271/