Получить список участников, которые не платили в хххх году - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь создать панель администратора для клиента, но у меня возникают некоторые проблемы с моими SQL-запросами.

Что я хочу сделать, так это отобразить страницу с таблицей данных всех участников, которые заплатили за год хххх (например, 2018). И добавьте небольшую кнопку выбора для него, чтобы фильтровать между участниками, которые заплатили, и участниками, которые не платили в xxxx году.

Схема таблицы для членов проста:

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. Джейн и Джо уже заплатили за свое членство в 2018 году, и их данные можно увидеть на странице платежей. И если администратор нажал на фильтр unpaid, он увидит, что Джон Доу остался единственным, кто не заплатил. Но завтра наступает 2019 год, и теперь администратор открыл новую ежегодную плату за 2019 год. А теперь, если он хочет отфильтровать подписку на неоплаченную, он должен получить список Джона, Джейн и Джо.

Проблема, с которой я сталкиваюсь, заключается в том, что если Джон заплатил за 2018, а не за 2019, SQL-запрос не получает его имя с остальными неоплаченными участниками, потому что он думает, что он действительно заплатил. И независимо от того, что я делаю, я не могу найти правильную логику для этого. Я не знаю, потому что я пишу запрос неправильно, или я неправильно сделал схему, или мне нужно создать другую таблицу, которая будет обрабатывать этот тип логики.

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, потому что Джон заплатил за предыдущий год, и запрос считает, что он также заплатил за этот.

Я надеюсь, что объяснил свою проблему соответствующим образом, и если вам нужны дополнительные разъяснения, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 08 ноября 2018

Вам нужно указать год_ид, который вас интересует в запросе. Он должен входить в предложение ON при объединении с payments.

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

DEMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...