0

コンドミニアムを管理するための小さなアプリ (PHP/MySQL) があります。condosテーブル、apartmentsテーブル、テーブル、ownersテーブルがありaccountます。

accountテーブルには、フィールドmonth_paidyear_paid(とりわけ)があります。

誰かが月額料金を支払うたびに、テーブルは月と年の数で更新されます。

サンプルのテーブル構造を次に示します。

condosテーブル:

+----+------------+---------+
| id | condo_name | address |
+----+------------+---------+

apartmentsテーブル:

+----+----------------+----------+
| id | apartment_name | condo_id |
+----+----------------+----------+

ownersテーブル:

+----+--------------+------------+
| id | apartment_id | owner_name |
+----+--------------+------------+

accountテーブル:

+----+----------+----------+------------+-----------+
| id | owner_id | condo_id | month_paid | year_paid |
+----+----------+----------+------------+-----------+

したがって、アカウント テーブルに次のようなレコードがある場合、この所有者が 2012 年 8 月に支払ったことを意味します。

+----+----------+----------+------------+-----------+
| id | owner_id | condo_id | month_paid | year_paid |
+----+----------+----------+------------+-----------+
|  1 |        1 |        1 |          8 |      2012 |
+----+----------+----------+------------+-----------+

私が知りたいのは、SQL クエリを (PHP を使用して) 作成して、3 か月以上の借金がある所有者、つまり、過去 3 か月以上料金を支払っていない所有者を取得する方法です。

可能であれば、次のようにコンドミニアムごとにデータをグループ化する必要があります。

CONDO XPTO:
Owner 1: 3 months debt
Onwer 2: 5 months debt

CONDO BETA
Owner 1: 4 months debt
Onwer 2: 6 months debt

ありがとう

4

6 に答える 6

4

次のようなクエリを作成する必要があります。

SELECT
    *
FROM
    owners
JOIN
    account
ON
    owners.id = account.owners_id
WHERE
    CONCAT( account.year_paid , '-' , account.month_paid , '-01') <= DATE_ADD( NOW(), INTERVAL -3 MONTH );

悲しいことに、あなたが提供した情報で私があなたに与えることができるのはそれだけです。より詳細なテーブル構造を示すことができれば、私はあなたをもっと助けることができます。

于 2012-12-27T11:15:05.393 に答える
1

あなたはそれをこのように保管することによってあなた自身にそれをより難しくしています。次に、月単位の差を自分で計算する必要があります。たとえば1月には、年も考慮する必要があるため、月だけを確認することはできません。

SELECT *
FROM owners
JOIN account ON owners.Id=account.ownersId
WHERE (    
  account.year_paid = year(now)
  AND (
    month(now)-account.month_paid>=3
  )
) OR (
  account.year_paid = year(now)-1
  AND (
    month(now)>=3
    OR (
      account.month_paid - month(now) <= 10
      AND month(now) = 1
    )
    OR (
      account.month_paid - month(now) <= 11
      AND month(now) = 2
    )
  )
) OR (
  account.year_paid < year(now)-1
)

datetime日付関数を使用できるように、最後に支払った時刻を列に保存することをお勧めします。

于 2012-12-27T11:23:47.450 に答える
0

これを試して、

select o.owner_name,c.condo_name   from owners o join account a join condos c
on o.id=a.owner_id  and c.id =a.condo_id  where year(curdate())=a.year_paid 
and  a.month_paid<month(curdate())-3
于 2012-12-27T12:01:28.483 に答える
0

アカウント テーブルを修正するには。s はオプションです。DROP COLUMN依存関係がある場合はそのままにしておくことをお勧めします。

ALTER TABLE account ADD COLUMN date_paid DATETIME;
UPDATE account SET date_paid = CONCAT(year_paid,'-',month_paid,'-01');
--ALTER TABLE account DROP COLUMN year_paid;
--ALTER TABLE account DROP COLUMN month_paid;

これは、データを取得する方法です。LEFT OUTER JOIN所有者またはコンドミニアムの記録が欠落している場合に備えて、sを使用しました。

SELECT c.condo_name, 
o.owner_name, 
min(PERIOD_DIFF(DATE_FORMAT(now(), '%Y%m'), DATE_FORMAT(date_paid, '%Y%m'))) min_months_debt 
FROM account a
LEFT OUTER JOIN condos c ON (c.id = a.condo_id)
LEFT OUTER JOIN owners o ON (a.owner_id = o.id)
WHERE a.date_paid <= DATE_ADD(NOW(), INTERVAL -3 MONTH)
GROUP BY c.condo_name, o.owner_name
ORDER BY c.condo_name

PS 上記は、少なくとも 1 回の支払いを行ったコンドミニアムの所有者にのみ有効です。一度も支払いをしたことがないコンドミニアムの所有者を確認したい場合は、コンドミニアムをアカウント テーブルの外部の所有者に関連付ける必要があります。または、コンドミニアムを所有者に関連付ける際にアカウント レコードを作成する場合もありますが、その場合は問題ありません。

于 2012-12-27T12:49:01.200 に答える
0

あなたが探しているものを実際に生み出す答えは見たことがありません。以下は、現在の月から最新の支払い日を差し引いて、負債の月を計算します。次に、結果を文字列に連結します。

select c.condo_name, o.owner_name, 
       cast(YEAR(now)*12+MONTH(now)) - MAX(year_paid*12+month_paid) as varchar(255)), ' month(s) debt'
from account a join
     owners o
     on o.id = a.owner_id join
     condos c
     on c.id = a.condo_id
group by c.condo_name,, o.owner_name
order by 1, 2

延滞支払者のみが必要な場合は、次のwhere条項を追加します。

where YEAR(now)*12+MONTH(now)) - MAX(year_paid*12+month_paid)  > 1

支払いの月の日付がないため、見逃す可能性のある境界条件がいくつかあります。

于 2012-12-27T14:33:36.807 に答える
0

私の理解が正しければ、月と年の 2 つの異なるフィールドがあります。なんで?フィールドが1つある場合、paid_dateこのクエリが機能すると言う

SELECT owner_id from account WHERE NOW()>DATE_ADD(paid_date, INTERVAL 3 MONTH)

フィールドを変更できる場合は、申し訳ありません。これがお役に立てば幸いです。

UPD: 次に、クエリで 2 つのフィールド (yearおよびmonth) を連結して、実際の日付のように見せ、フィールドではなく関数YYYY-MM-DDで使用することをお勧めします。DATE_ADDpaid_date

于 2012-12-27T11:26:26.227 に答える