mysqli select query для выбора некоторых таблиц, которые могут не существовать, используя join - PullRequest
0 голосов
/ 18 января 2019

Привет, я действительно застрял здесь, вот куда я достиг, пытаясь изо всех силвыберите всех участников из 13c_users, которые подписались (13c_subs='1') на ежемесячные платежи из таблицы 13c_payments, которые, возможно, не платили ни одного месяца любого года до настоящего времени (13c_month хранит номер month и 13c_year stores номер год в таблице 13c_payment

Теперь приведенный выше запрос работает довольно неплохо, но он не выбирает пользователей, которые еще ничего не заплатили, напримерпользователя подписан и не заплатил ни за какой месяц, запрос не будет соответствовать ему.

Пожалуйста, проверьте запрос, что я делаю здесь неправильно!

////////////////////////////////// отредактировано /////////////////////

Это до сих пор, пока я не мог достичь, я не получаю ожидаемых результатов:

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 ))

В приведенном выше запросе выбираются все участники, которые никогда не платили, ноNот тех участников, которые заплатили за первые 2 месяца, а не после этого.

таблица оплаты получает запись о каждом платеже, выполненном в отдельных строках..

я точно знаю, что в этой части запроса что-то не так

(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 NOTIN (1,2,3,4,5,6,7,8,9,10,11,12), но строки раздельные, поэтому он всегда будет выбирать каждую строку

Таблица пользователей enter image description here

Таблица платежей enter image description here

1 Ответ

0 голосов
/ 18 января 2019

Вот очень упрощенный пример, где я определяю количество ожидаемых платежей и количество месяцев, в течение которых был произведен платеж - если не совпадает, то меня интересует

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 были в том же месяце.

...