3

ここ数日間、私を悩ませてきた SQL クエリに苦労しています。そして、皆さんが私を助けてくれることを願っています!

ショッピングカートの請求書を作成します。請求書は 2 つのテーブルに保存されます。最初のテーブル「ordre」には、ユーザーに関する情報、請求書が支払われたかどうか、日付などがあります。2 番目のテーブル「ordreelementer」には、その請求書に属するすべてのアイテムが保持されます。

ここに私の問題があります。顧客に関する詳細と顧客が購入したアイテムを含む請求書を印刷するために必要なすべての情報を、いったいどうやって入手するのでしょうか? 別の SQL JOINS を試しましたが、期待どおりに動作しませんでした。ここで何か助けていただければ幸いです。私は PHP をコーディングし、MySQL データベースを実行しています。

これは私の最新のSQL文です

$sql = "SELECT ordre.id, 
               ordre.uid, 
               ordre.dato, 
               ordre.status, 
               ordre.betalt, 
               ordre.navn, 
               ordre.adresse, 
               ordreelementer.oid,
               ordreelementer.navn AS elnavn,  
               SUM(ordreelementer.ant * ordreelementer.stkpris) AS tot
          FROM ordre 
          INNER JOIN ordreelementer 
               ON ordre.id=ordreelementer.oid 
          WHERE ordre.uid = ".brukerInfo('id')." AND ordre.id = ".$id."";

すべてのヘルプは大歓迎です!

4

3 に答える 3

1

これにより、合計注文の合計が得られ、注文要素はカンマ区切りの値として出力されます。

SELECT ordre.id, 
           ordre.uid, 
           ordre.dato, 
           ordre.status, 
           ordre.betalt, 
           ordre.navn, 
           ordre.adresse, 
           ordre.id,
           GROUP_CONCAT(ordreelementer.navn) AS elnavn,  
           SUM(ordreelementer.ant * ordreelementer.stkpris) AS tot
      FROM ordre 
      INNER JOIN ordreelementer 
           ON ordre.id=ordreelementer.oid 
      WHERE ordre.uid = ".brukerInfo('id')." AND ordre.id = ".$id.""
      GROUP BY ordre.id;

または、注文要素 ID でグループ化し、WITH ROLLUP オプションを使用することもできます。これにより、要素ごとに個別のレコードが得られ、最後に総計行が生成されます。

SELECT ordre.id, 
       ordre.uid, 
       ordre.dato, 
       ordre.status, 
       ordre.betalt, 
       ordre.navn, 
       ordre.adresse, 
       ordreelementer.oid,
       ordreelementer.navn AS elnavn,  
       SUM(ordreelementer.ant * ordreelementer.stkpris) AS eltot
  FROM ordre 
  INNER JOIN ordreelementer 
       ON ordre.id=ordreelementer.oid 
  WHERE ordre.uid = ".brukerInfo('id')." AND ordre.id = ".$id.""
  GROUP BY ordereelementer.id WITH ROLLUP;

各グループには要素項目が 1 つしかないため、この最後のグループ化は疑似グループです。

于 2013-09-12T20:49:07.027 に答える
0

単純に請求書にデータを入力しているだけなので、このクエリを複数のクエリに分割することをお勧めします。ただし、純粋主義者であるか実用的であるかにかかわらず、何らかの理由でクエリを 1 つにする必要がある場合を除きます。ordreこれにより、結果セットのすべての行にあるすべての情報の重複データを防ぐことができます。とにかく、請求書を実行して印刷するには、次のようにします。

まず、テーブルから 1 行だけ必要なデータordre、つまり基本的な注文情報を取得します。

$sqlOrdreInfo = "SELECT ordre.id, 
                        ordre.uid, 
                        ordre.dato, 
                        ordre.status, 
                        ordre.betalt, 
                        ordre.navn, 
                        ordre.adresse
                FROM ordre 
                WHERE ordre.uid = ".brukerInfo('id')." AND ordre.id = '.$id.'";

次に、個々の注文明細を引き出します。

$sqlOrdreLines = "SELECT ordreelementer.oid,
                         ordreelementer.navn AS elnavn
                  FROM ordreelementer 
                  WHERE  ordreelementer.oid = '.$id.'";

3 番目に、必要な金額を引き出します。

$sqlOrdreTotal = "SELECT SUM(ordreelementer.ant * ordreelementer.stkpris) AS tot
                  FROM ordreelementer 
                  WHERE  ordreelementer.oid = '$id.'
                  GROUP BY ordreelementer.oid";

これにより、3 つの結果セットが得られ、請求書に必要なデータを簡単に印刷できます。

于 2013-09-12T20:36:03.493 に答える
0
$sql = "SELECT ordre.id, 
               ordre.uid, 
               ordre.dato, 
               ordre.status, 
               ordre.betalt, 
               ordre.navn, 
               ordre.adresse, 
               ordreelementer.oid,
               ordreelementer.navn AS elnavn,  
               ordreelementer.ant as val1,
               ordreelementer.stkpris AS val2
          FROM ordre 
          INNER JOIN ordreelementer 
               ON ordre.id=ordreelementer.oid 
          WHERE ordre.uid = ".brukerInfo('id')." AND ordre.id = ".$id."";

このクエリはすべての値を返します。ループを介して請求書を生成するときに、合計値を計算する必要があります。

于 2013-09-12T20:41:56.553 に答える