2011-11-17 167 views
1

我有一個簡單的問題,但我是SQL新手,請原諒我的無知。簡單的mySQL子查詢

我有一份會計報告,計算出欠款餘額並累計餘額,以向我報告特定期間內的未償還總額。問題在於,每個作業都有許多發票可以提供運行總量/餘額,因爲這個時候,當我的當前查詢累計餘額時,它顯示餘額非常高,我們發現當前代碼正在添加餘額的所有發票。 例 - 如果作業ID 001有四個invoices- I-001平衡200, I-002平衡100, I-003天平50, I-004的平衡0

它會告訴我,有實際上它爲零時是未完成的350美元。

,我能想到的(這我不知道如何編寫代碼)是組的結果通過作業ID,並使用MAX功能,只選擇higest ID爲每JOBID

的問題,我的解決辦法我的觀點是餘額不會保存到桌面,而是每次需要時重新計算。你可以建議什麼給我只能從最高的發票ID平衡特定JOBID 我的發票表有以下幾列:

1 ID int(11) 
2 ParentID int(11) 
3 JOBID varchar(100) 
4 DATE date 
5 LENSES decimal(10,2) 
6 FRAMES decimal(10,2) 
7 TAXABLEGOODS decimal(10,2) 
8 DISCOUNT decimal(10,2) 
9 PREVIOUSBALANCE  decimal(10,2) 
10 PAYMENT  decimal(10,2) 
11 PAYMENTTYPE  varchar(200) 
12 NOTES varchar(255) 
13 PMA  decimal(10,2) 

當前的代碼看起來是這樣的:

$pieces = explode("-", $_REQUEST["STARTDATE"]); 
$startDate=$pieces[2] . "-" . $pieces[1] . "-" . $pieces[0]; 



if($_REQUEST["ENDDATE"]==""){ 
$endDate=0; 
}else{ 
$pieces = explode("-", $_REQUEST["ENDDATE"]); 
$endDate = $pieces[2] . "-" . $pieces[1] . "-" . $pieces[0]; 
} 

$result  = mysql_query("SELECT * FROM INVOICES WHERE DATE BETWEEN '" .  $startDate . "' AND '" . $endDate . "'"); 
$totalCount = 0; 
$total  = 0; 
$allPayments= 0; 
$pmtTypes = Array(); 
$totalHST = 0; 
$outstanding=0; 
$payments=0; 

while($theRow=mysql_fetch_array($result)){ 

$allPayments += $theRow["PAYMENT"]; 

if($theRow["PAYMENTTYPE"] == "") $theRow["PAYMENTTYPE"] = "BLANK"; 

if(isset($pmtTypes[$theRow["PAYMENTTYPE"]])){ 
    $pmtTypes[$theRow["PAYMENTTYPE"]] += $theRow["PAYMENT"];; 
}else{ 
    $pmtTypes[$theRow["PAYMENTTYPE"]] = $theRow["PAYMENT"];; 
} 

if($theRow["PREVIOUSBALANCE"] != 0) continue; 

$subTotal = (($theRow["LENSES"] + $theRow["FRAMES"] + $theRow["TAXABLEGOODS"]) - $theRow["DISCOUNT"]); 
$HST  = ($theRow["TAXABLEGOODS"] * 0.13); 
$totalHST+= $HST; 
$total += ($subTotal + $HST); 
$payments+=$theRow["PAYMENT"]; 

} 
$outstanding=$total-$payments; 

任何人有什麼可以貢獻的? 我將不勝感激任何幫助。

+0

您可以在您的php代碼中使用一些縮進來提高可讀性 – abcde123483

+0

謝謝,當我得到它的工作時,我會花一些時間清理外觀。任何關於解決問題的想法? – user1052646

回答

0

告訴我只從最高的發票ID平衡特定JOBID

單個作業ID:

SELECT lenses+frames+taxablegoods-discount+previousbalance AS balance 
FROM invoices WHERE jobid=? 
ORDER BY id DESC LIMIT 1 

組的結果通過作業ID,並使用MAX功能僅選擇每個JOBID的最大ID

如果您想一次查詢多個工作的最新發票,那麼您正在討論每個組的最大選擇。 SQL並不像你希望的那樣容易。有various approaches,包括子查詢,但在MySQL我通常有利於空自加入:

SELECT i0.jobid, i0.lenses+...etc... AS balance 
FROM invoices AS i0 LEFT JOIN invoices AS i1 ON i1.jobib=i0.jobid AND i1.id>i0.id 
WHERE i1.id IS NULL 

那就是:「給我行不存在行具有相同的作業ID,但更高的發票ID」 。

如果兩個日期之間做這個,你需要的條件適用於在加盟兩面:

SELECT i0.jobid, i0.lenses+...etc... AS balance 
FROM invoices AS i0 LEFT JOIN invoices AS i1 ON 
    i1.jobib=i0.jobid AND i1.id>i0.id AND 
    i1.date BETWEEN ? AND ? 
WHERE 
    i0.date BETWEEN ? AND ? 
    i1.id IS NULL 

順便說一句,你必須從把串到你的查詢的SQL注入漏洞。使用mysql_real_escape_string()或更好的參數化查詢來避免這些問題。

0

子查詢會是這個樣子:

SELECT * FROM INVOICES I1 
WHERE DATE BETWEEN ? AND ? 
AND ID = (SELECT MAX(ID) FROM INVOICES I2 
      WHERE DATE BETWEEN ? AND ? 
      AND I2.JOBID = I1.JOBID) 

你應該考慮使用參數化查詢,而不是串聯用戶輸入的字符串。在最低限度使用mysql_real_escape_string - 請參閱:http://www.php.net/manual/en/function.mysql-real-escape-string.php