【问题标题】:Problems with invoice from two tables两张表的发票问题
【发布时间】:2013-09-17 08:51:41
【问题描述】:

最近几天一直困扰着我的 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."";

非常感谢所有帮助!

【问题讨论】:

  • 如果1个订单中有很多商品,您应该使用LEFT JOIN
  • SQL 中的SUM 函数是一个分组函数。这意味着它需要一个GROUP BY 函数,如果你没有一个函数,它会像整个结果被分组一样。您的问题是只看到一个结果吗?
  • 看起来他只想要一个 ordre.id 的结果,所以应该不错。正如 dianuj 提到的,LEFT JOIN orderelementer 而不是 INNER JOIN 应该这样做。
  • LEFT 和 RIGHT JOIN 没有区别。我试图更改为 LEFT,并删除 SUM()。没有不同。此 SQL 仅显示用户创建的一张发票。我只使用“ordre”表中的一行,但“ordreelementer”中的一个未知数字。这取决于用户在订购之前将多少商品添加到购物车中。

标签: php mysql sql join


【解决方案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;

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

【讨论】:

    【解决方案2】:

    由于您只是填写发票,我的想法是将这个查询分解为几个查询,除非您出于某种原因需要它成为一个查询,无论是纯粹的还是实用的。这将使您避免在结果集的每一行上出现所有 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 个结果集,您可以轻松地在发票上打印所需的数据。

    【讨论】:

    • 是的,我知道我可以将其拆分,但在一个查询中包含所有内容不是更快吗?
    • 可能,但我认为差异不会很大。你有多少数据?此外,如果您要为发票的每一行复制真正只需要一次的订单信息,具体取决于行数,您的退货集可能会比要求的大得多。您仍然必须使用自己的查询或 PHP 计算来获得总和。我会务实,并会采用令人满意的工作并稍后进行优化。但您可以测试查询,决定权在您手中。
    【解决方案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."";
    

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

    【讨论】:

    • 好的,问题是我添加到查询中的 SUM()?
    • SUM() 函数返回数值列的总和。您可以使用 GROUP BY 子句获取各种记录集的总和。
    猜你喜欢
    • 2021-07-18
    • 1970-01-01
    • 2016-10-14
    • 2019-09-05
    • 1970-01-01
    • 2018-12-10
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多