Php 来自两个表的发票问题

Php 来自两个表的发票问题,php,mysql,sql,join,Php,Mysql,Sql,Join,在过去的几天里,我一直在处理一个困扰着我的SQL查询。我希望你们能帮助我 我将为购物车创建发票。发票保存在两个表中。第一个表“ordre”包含有关用户的信息、发票是否已支付以及日期等。。第二个表“ordreelementer”包含属于该发票的所有项目 我的问题来了。我究竟如何获得打印发票所需的所有信息,包括客户及其购买物品的详细信息?我尝试了不同的SQL连接,但没有达到预期效果。我们将非常感谢您的帮助!我正在编写PHP代码并运行MySQL数据库 这是我最新的SQL语句 $sql = "SELEC

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

我将为购物车创建发票。发票保存在两个表中。第一个表“ordre”包含有关用户的信息、发票是否已支付以及日期等。。第二个表“ordreelementer”包含属于该发票的所有项目

我的问题来了。我究竟如何获得打印发票所需的所有信息,包括客户及其购买物品的详细信息?我尝试了不同的SQL连接,但没有达到预期效果。我们将非常感谢您的帮助!我正在编写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."";

非常感谢您的帮助

由于您只是填充发票,我的想法是将此查询分解为几个查询,除非出于某种原因(无论是纯粹的还是实用的),您需要将其作为一个查询。这将防止您在结果集的每一行上重复所有
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个结果集,您可以轻松地在发票上打印所需的数据

$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."";

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

这将给出总订单的总和,订单元素将显示为逗号分隔的值

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;
或者,您可以根据order元素id对其进行分组,并使用WITHROLLUP选项。这将为每个元素提供一个单独的记录,并在最后为您生成一个总计行

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;

最后一个分组是一个伪分组,因为每个分组只有一个元素项。

如果有多个项与一个顺序相对应,则应使用
左连接
SQL中的
求和
函数是一个分组函数。这意味着它需要一个
groupby
函数,如果您没有,它将充当整个结果分组的角色。你的问题是你只看到一个结果吗?看起来他只想要一个ordre.id的结果,所以应该是好的。正如dianuj提到的,应该使用左连接orderelementer而不是内部连接。左连接和右连接没有区别。我试图改为左,并删除SUM()。没有区别。此SQL仅显示用户创建的一张发票。我只使用了“ordre”表中的一行,但使用了“ordreelementer”中的未知数字。这取决于用户在订购之前向购物车中添加了多少物品。是的,我知道我可以将其拆分,但将其全部放在一个查询中不是更快吗?可能吧,但我认为差异不会很大。你有多少数据?此外,如果您要复制ordre信息,实际上发票的每一行只需要一次,这取决于行数,那么您的返回集可能会比所需的大得多。您仍然需要通过自己的查询或PHP计算来获得总和。我会实事求是,按照令人满意的方式去做,然后再优化。但是您可以测试查询,决定权在您。好的,问题是我添加到查询中的SUM()函数返回数值列的总和。您可以使用GROUP BY子句获取各种记录集的总和。