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