我正在从成员和费用这两个表中获取数据。我想只选择那些本月没有存款的成员。这是我尝试过的,但结果不是我想要得到的。任何帮助将不胜感激 。我正在使用 mysql 。
SELECT
members.memberid,
members.companyid,
members.name,
members.initials,
members.surname,
members.datejoined,
members.usercode,
members.address,
members.cell,
members.pic,
members.idnumber, members.rank,
members.address2,
fees.feestype,fees.amountpaid,
fees.companyid,fees.paiddate,
fees.usercode
FROM
members
INNER JOIN fees
ON members.memberid = fees.memberid
WHERE
MONTH(fees.paiddate) < MONTH(CURDATE())
AND YEAR(fees.paiddate) < YEAR(CURDATE())
您需要以不同的方式进行:选择不是本月支付
IN
的成员集合的所有成员:dbfiddle在这里
您实际查询在当前年份之前的年份和当前年份之前的月份支付过费用的特定成员。
作为第二种选择,您可以使用
NOT EXISTS
:dbfiddle在这里
还有另一个(我认为不太清楚)替代方案,执行
LEFT JOIN
并设置一个WHERE
条件,该条件将过滤掉实际从 JOIN 右侧检索某些内容的行(即:仅使用所有列的行WHERE
,特别memberid
是 NULL在右侧):检查使用 LEFT JOIN 或 NOT EXISTS 之间的最佳实践
并在此处检查所有dbfiddle
在关系代数中,这称为反连接
更新
从Kondybas的解决方案更进一步,正如 ypercube 在对Kondibas回答的评论中所指出的,这可以进一步简化为:
像这样写条件(即:没有应用到 paiddate 的函数),它将使用一个索引,例如:
...从执行计划中可以看出:
dbfiddle在这里
joanolo解决方案的第三种替代方法是从表中获取带有 NULL 的记录
LEFT JOIN
:正如yupecube建议的那样,查询可以简化为:
唯一的缺点是复杂功能条件下的 JOIN 通常非常慢。