mysqli select查询以选择一些可能无法使用联接的表

时间:2019-01-18 06:29:53

标签: mysql mysqli mysqli-multi-query

您好,我真的被困在这里,这是我尽力而为的地方

   select 13c_name,13c_mobile,13c_pid,p.13c_usid,p.13c_comp_id,13c_amount,
   13c_mode,13c_month,13c_year,13c_rec,13c_rec_date,13c_check,13c_comments,
   13c_status,13c_ip,13c_message,13c_rec_by,13c_invoice_pay from 

   13c_users u , 13c_payments p 

   where ( (u.13c_usid=p.13c_usid and 13c_subs='1') and (13c_year IN ('$new_year') and 13c_month NOT IN (1|2|3|4) or 13)  )

我想要实现的是这样的东西

  

我要从13c_users中选择所有已订阅的成员    (13c_subs='1')到表13c_payments的每月付款(可能没有)    至今为止已支付任何一年的任何月份(13c_month    13c_year stores表中的号和13c_payment 号)

现在上面的查询效果不错,但是它不会选择尚未支付任何费用的用户,例如已订阅该用户且未支付任何月份的用户,该查询将不会与join tbale匹配。

请在此处检查查询我在做什么错!

////////////////////////////////// 已编辑 ///// ////////////

到现在为止,我仍然可以达到预期的效果:

select * from ( (select * from 13c_users u Left JOIN 13c_payments p ON
u.13c_usid=p.13c_usid where (13c_subs='1' and u.13c_comp_id='$yid') ) as T ) 
where ( (13c_year is NULL or 13c_year IN (2019) ) and (13c_month IS NULL or 
13c_month NOT IN (1,2,3,4,5,6,7,8,9,10,11,12)) and (T.13c_invoice_pay='0' or T.13c_invoice_pay is 
NULL ))

上面的查询选择所有从未付款的会员,但不选择前两个月且之后未付款的会员。

表格付款可获取在单独行中进行的每笔付款的输入。

请帮助我,我在这里卡住了。

我知道查询的这一部分肯定有问题

(13c_year is NULL or 13c_year IN (2019) ) and (13c_month IS NULL or 
 13c_month NOT IN (1,2,3,4,5,6,7,8,9,10,11,12)

如果行没有提到的月份,我想选择该行13c_month NOT IN(1,2,3,4,5,6,7,8,9,10,11,12)但行是分开的,因此它将始终选择每一行

用户表 enter image description here

付款表 enter image description here

1 个答案:

答案 0 :(得分:1)

这是一个非常简化的示例,其中我计算出预期的付款次数和已付款的月数-如果不一致,那么我很感兴趣

drop table if exists u,t;
create table u (id int,subs int, dt date);
create table t (uid int,dt date);
insert into u values (1,1,'2019-01-01'),(2,1,'2018-11-01'),(3,1,'2018-09-01');
insert into t values
(1,'2019-01-01'),
(2,'2018-11-11'),(2,'2018-11-13'),(2,'2019-01-01');



select id,
        ((year(now()) * 12 + month(Now())) -  (year(u.dt) * 12 + month(u.dt))) + 1 numexpected,
        coalesce(s.paidup,0) paidup
from u
left join
(select t.uid,count(distinct year(t.dt),month(t.dt)) paidup
from t
group by t.uid) s on s.uid = u.id
where ((year(now()) * 12 + month(Now())) -  (year(u.dt) * 12 + month(u.dt))) + 1 <> coalesce(s.paidup,0);

+------+-------------+--------+
| id   | numexpected | paidup |
+------+-------------+--------+
|    2 |           3 |      2 |
|    3 |           5 |      0 |
+------+-------------+--------+
2 rows in set (0.00 sec)

请注意,每个月都要付款的期望似乎有点简单-预付款和滞纳金怎么办?例如,UID 2进行了3笔付款,但2笔在同一个月内。