两张桌子的发票问题

时间:2013-09-12 19:55:30

标签: php mysql sql join

我正在处理一个在过去几天一直困扰着我的SQL查询。我希望你们能帮助我!

我要为购物车创建发票。发票保存在两个表中。第一个表“ordre”包含有关用户的信息,是否支付发票以及日期等。第二个表“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."";

非常感谢所有帮助!

3 个答案:

答案 0 :(得分: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 :(得分:0)

由于您只是填写发票,我的想法是将此查询分解为多个查询,除非您出于某种原因需要将其作为一个查询,无论是纯粹还是实际。这样可以避免在结果集的每一行显示所有ordre信息的重复数据。无论如何,要让您关闭并运行并打印发票,以下内容应该有效。

首先,从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.'";

第三,拉出你想要的总和:

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

这将为您提供3个结果集,您可以轻松地在发票上打印所需的数据。

答案 2 :(得分: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."";

此查询返回所有值。现在,您必须通过循环生成发票时计算总价值。