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