0

2 つのテーブルがあります。請求書と請求書アイテム。
請求書アイテムには、各請求書のアイテムが含まれます

例えば:

invoices
----------------------------------
| id  |status| net | tax | total |
----------------------------------
| 72  |paid  | 100 | 120 |  220  |
| 73  |unpaid| 50  | 5   |  55   |
| 74  |paid  | 400 | 45  |  445  |
| 75  |paid  | 250 | 67  |  317  |


invoiceitems
-------------------------------
| invoiceid |itemdescription |
-------------------------------
| 72        | apples         |
| 72        | pears          |
| 72        | oranges        |
| 73        | lemons         |
| 73        | oranges        |

ご覧のとおり、請求書番号 72 の例では 3 つの項目があります。

請求書で特定のものを検索し、特定のフィールドの数を表示したいと考えています。

しかし、私の問題は、合計値に2番目のテーブルにあるフィールドの数が掛けられているように見えることです。

$sql = "SELECT COUNT(DISTINCT invoices.id) AS num, 
SUM(CASE invoices.status WHEN 'Paid' THEN 1 ELSE 0 END) AS numpaid, 
SUM(CASE invoices.status WHEN 'Paid' THEN invoices.total ELSE 0 END) AS sumtotal,
FROM invoices 
LEFT JOIN invoiceitems ON invoices.id=invoiceitems.invoiceid
WHERE invoices.id LIKE :invoiceid 
AND IFNULL(opcinvoiceitems.itemdescription, '')  LIKE :itemdescription
AND invoices.net LIKE :net 
AND invoices.tax LIKE :tax 
AND invoices.total LIKE :total
AND ......" 

したがって、上記を使用すると、請求書 72 の合計は 3 で乗算されます。

申し訳ありませんが、これは本当に説明が下手なのはわかっていますが、他の方法で説明することはできません。何年も探していましたが、解決策が見つかりません。誰かが助けてくれることを願っています。ありがとう

4

2 に答える 2

0

結合を行うと、元のテーブルのレコードを照合して作成されたレコードが生成されます。したがって、請求書 #72 の 3 つのレコードがあり、それぞれが #72 の単一の請求書レコードと #72 の各請求書項目を照合することによって作成されます。結合された各レコードの合計は同じ (この場合は 220) になるため、合計はその 3 倍になります。

それでは、合計が必要なようです。total を直接使用することも、合計を count で割ることもできます (これも計算しているように見えます)。

于 2013-09-10T00:48:47.787 に答える
0

invoiceItems必要なことを行う 1 つの方法は、結合する前にテーブルを事前に集計することです。

SELECT COUNT(i.id) AS num, 
       SUM(CASE i.status WHEN 'Paid' THEN 1 ELSE 0 END) AS numpaid, 
       SUM(CASE i.status WHEN 'Paid' THEN i.total ELSE 0 END) AS sumtotal,
FROM invoices  i LEFT JOIN
     (select ii.invoiceid, sum(. . .) as . . .
      from invoiceitems ii
      where IFNULL(ii.itemdescription, '')  LIKE :itemdescription AND
      group by ii.invoiceid
     ) ii
     ON i.id = ii.invoiceid
WHERE i.id LIKE :invoiceid AND
      i.net LIKE :net  AND
      i.tax LIKE :tax AND
      i.total LIKE :total AND .....

クエリは実際invoiceitemsには句で使用されていないfromため、より詳細な例を提供するのは困難です。

于 2013-09-10T00:51:27.907 に答える