根据范围mysql从invoice和fess表中提取数据

问题描述 投票:0回答:1

我有 3 个表 members fees 和 tblinvoice 他们都有一个 memberid 因此,如果有人支付数据,则数据会转到费用中,并且在费用表中创建 tblinvoice 和 invoiceid,并将 tblinvoice 和 memberid 插入这两个表中,两个人知道哪个成员支付了费用。 现在,当创建发票时,只有 tblinvoice 收到数据,但仍然带有 memberid。

现在我想从 3 个表中提取数据,但这两个表的费用和 tblinvoice 数据将基于 tblinvoice 的日期范围,即 invoicedate 以及来自 fees fees.paiddate 的 tblinvoice 日期。

现在如果表费用中有数据,如果没有从 tblinvoice 中提取任何数据,或者如果两者都从两者中提取。

此处的目的是提取付款和发票金额的报表。我想知道我是否解释得很好这是我在下面尝试使用 mysql 的方法。

select 
members.memberid,
fees.feesid,
members.usercode,
members.title, 
members.name,
members.surname,
members.address, 
members.city, 
members.cell, 
fees.recieved_by, 
fees.paidfor,
fees.fromdate,
fees.amountpaid AS amountpaidMe, 
fees.feestype,
fees.qty,
fees.paiddate,
fees.unitPrice,
fees.todate,
fees.invoiceid,
tblinvoice.amount AS invoicedAmount,
tblinvoice.invoicedate

FROM members

INNER JOIN  fees ON fees.memberid = members.memberid
LEFT OUTER JOIN  tblinvoice  ON tblinvoice.memberid = fees.memberid

WHERE members.memberid ='62396'
&& tblinvoice.invoicedate BETWEEN '2023-01-01' AND  '2023-03-05' OR  fees.paiddate BETWEEN '2023-01-01' AND  '2023-03-05'

我被要求共享三个表中的所有数据,下面是数据。 但是,如果我尝试使用日期范围进行查询,它就会出错 我想从基于支付日期范围的费用表中获取所有数据,并且基于发票日期范围从发票表中获取所有数据是一个表没有数据只是将该行变黑然后在另一个表中提取数据

查询会员 从 memberid = '62396' 的成员中选择名称 结果 姓名 阿卜杜拉·本·萨拉姆

Query fees table 
SELECT `amountpaid` , `paiddate` , `memberid` FROM `fees` WHERE memberid = '62396'

results 



    Full texts                                         amountpaid      paiddate       memberid
    Edit Edit   Copy Copy   Delete Delete   1300.00     2022-08-18 11:44:44     62396
    Edit Edit   Copy Copy   Delete Delete   1300.00     2022-09-13 03:56:50     62396
    Edit Edit   Copy Copy   Delete Delete   650.00      2022-11-15 04:12:34     62396
    Edit Edit   Copy Copy   Delete Delete   1500.00     2022-12-07 09:37:13     62396
    Edit Edit   Copy Copy   Delete Delete   1300.00     2023-01-13 06:00:58     62396
    Edit Edit   Copy Copy   Delete Delete   1300.00     2023-01-24 05:55:11     62396
    Edit Edit   Copy Copy   Delete Delete   1300.00     2023-02-03 08:36:36     62396
    Edit Edit   Copy Copy   Delete Delete   1300.00     2023-02-21 08:38:53     62396



Query tbl invoice table 
SELECT `amount`, `memberid`, `invoicedate` FROM `tblinvoice` WHERE memberid = '62396' 

results 


Full texts                                         amount   memberid invoicedate
    Edit Edit   Copy Copy   Delete Delete   340.00  62396   2023-03-01 18:27:18
    Edit Edit   Copy Copy   Delete Delete   89.00   62396   2023-03-01 18:28:41
    Edit Edit   Copy Copy   Delete Delete   88.00   62396   2023-03-01 18:28:41
    Edit Edit   Copy Copy   Delete Delete   21.00   62396   2023-03-02 09:22:01
    Edit Edit   Copy Copy   Delete Delete   55.00   62396   2023-03-02 09:22:01
    Edit Edit   Copy Copy   Delete Delete   890.00  62396   2023-03-02 11:51:27
mysql
1个回答
1
投票

与其尝试在最后的 where 子句中限制来自费用或发票的行,不如尝试将日期范围包含在连接条件中。例如

SELECT
      members.memberid
    , fees.feesid
    , members.usercode
    , members.title
    , members.name
    , members.surname
    , members.address
    , members.city
    , members.cell
    , fees.recieved_by
    , fees.paidfor
    , fees.fromdate
    , fees.amountpaid AS amountpaidMe
    , fees.feestype
    , fees.qty
    , fees.paiddate
    , fees.unitPrice
    , fees.todate
    , fees.invoiceid
    , tblinvoice.amount AS invoicedAmount
    , tblinvoice.invoicedate
FROM members
INNER JOIN fees ON fees.memberid = members.memberid
    AND fees.paiddate BETWEEN '2023-01-01' AND '2023-03-05'
LEFT OUTER JOIN tblinvoice ON tblinvoice.memberid = fees.memberid
    AND tblinvoice.invoicedate BETWEEN '2023-01-01' AND '2023-03-05'
WHERE members.memberid = '62396'

注意,如果您有一个左连接表,那么在 where 子句中使用该表中的列可以导致内部连接的效果,除非明确允许由于不匹配的行而导致的 NULL。通过将日期范围过滤器移动到连接中,您可以避免这种增加的复杂性。

© www.soinside.com 2019 - 2024. All rights reserved.