3

次の構造を持つ 3 つのテーブルがあります。

CREATE TABLE `contract` (
  `conid` int(11) NOT NULL AUTO_INCREMENT,
  `servName` int(11) NOT NULL,
  `cid` int(11) NOT NULL,
  `term` int(11) DEFAULT NULL,
  `monthly_charge` double NOT NULL,
  `start_date` date NOT NULL,
  `expiry_Date` date NOT NULL,
  `next_PayDate` date DEFAULT NULL,
  `status` tinyint(4) NOT NULL,
  PRIMARY KEY (`conid`),
  UNIQUE KEY `servName` (`servName`,`cid`)
) 

CREATE TABLE `servicetype` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `serviceName` varchar(255) NOT NULL,
  PRIMARY KEY (`sid`)
) 

CREATE TABLE `transactions` (
  `tid` int(11) NOT NULL AUTO_INCREMENT,
  `conid` int(11) NOT NULL,
  `amount` double NOT NULL,
  `paidate` date NOT NULL,
  `descr` text NOT NULL,
  PRIMARY KEY (`tid`)
)

私が取得したいのは、特定のユーザーの最新のトランザクションです:-

conid、serviceName、cid、term、monthly_charge、start_date、expiry_Date、next_PayDate、amount、payate、descr

そして、これは私がその情報への取得に使用している選択ステートメントです:-

SELECT c.conid, serviceName, cid, term, monthly_charge, start_date, expiry_Date, next_PayDate, status, amount, paidate, descr
FROM servicetype s 
LEFT JOIN contract c on s.sid = c.servName 
LEFT JOIN transactions t ON c.conid=t.conid
WHERE cid = 4 AND status = 1

ステートメントは機能しますが、cid 4 に属するすべてのトランザクションが表示され、表示したいのは、上記のコントラクト (conid) に属する最新のトランザクションのみです。

お時間と労力をかけていただきありがとうございます。

4

2 に答える 2

1

MySQL を使用しGROUP BYてすべての結果を特定の でグループ化し、条件をcid使用してトランザクションを取得したいようです。HAVINGMAX()

SELECT
    c.conid, serviceName, cid, term, monthly_charge, start_date, expiry_Date, next_PayDate, status, amount, paidate, descr
FROM servicetype s 
    LEFT JOIN contract c on s.sid = c.servName 
    LEFT JOIN transactions t ON c.conid=t.conid
WHERE
    cid = 4 AND status = 1

GROUP BY cid
HAVING t.paidate = MAX(t.paidate)
于 2012-10-03T14:15:17.373 に答える
1

JOINテーブルの上で2回できtransactionsます。最初の結合はmax()それぞれの日付を取得しconid、2 番目の結合はその最大トランザクションの詳細を返します。

select c.conid,
  s.serviceName,
  c.cid,
  c.term,
  c.monthly_charge,
  c.start_date,
  c.expiry_date,
  c.next_PayDate,
  c.status,
  t2.amount,
  t1.paidate,
  t2.descr
FROM servicetype s 
LEFT JOIN contract c 
  on s.sid = c.servName 
LEFT JOIN
(
  SELECT max(paidate) paidate, conid
  FROM transactions
  GROUP BY conid
) t1
  ON c.conid=t1.conid
LEFT JOIN transactions t2
  ON t1.paidate = t2.paidate
  AND t1.conid = t2.conid
WHERE c.cid = 4 
  AND c.status = 1

編集、コメントに基づいて、クエリは次のようになります。

select c.conid,
  s.serviceName,
  c.cid,
  c.term,
  c.monthly_charge,
  c.start_date,
  c.expiry_date,
  c.next_PayDate,
  c.status,
  t3.amount,
  t3.paidate,
  t3.descr
FROM servicetype s 
LEFT JOIN contract c 
  on s.sid = c.servName
LEFT JOIN
(
  SELECT max(paidate) paidate, conid, max(tid) tid
  FROM transactions t
  GROUP BY conid
) t1
  on c.conid = t1.conid
LEFT JOIN transactions t3
  on t1.conid = t3.conid
  and t1.paidate = t3.paidate
  and t1.tid = t3.tid
where c.cid = 4
  and c.status = 1
GROUP BY c.conid;

デモで SQL Fiddleを参照してください

于 2012-10-03T14:16:31.967 に答える