如何根据我的要求更改 sql 查询?

Posted

技术标签:

【中文标题】如何根据我的要求更改 sql 查询?【英文标题】:How to change sql query with my requirement? 【发布时间】:2019-08-15 02:13:39 【问题描述】:

在我的 sql 数据库中,我有两个表,一个是 Invoices,另一个是 invoiceitems。所以我从发票(发票表)和发票项目(从发票项目表)中获取客户详细信息。 我在我的 sql 代码中遇到了一个问题。如果发票在 invoiceitems 表中没有项目,则无法获取数据。

我想获取所有数据,包括发票是否在发票项目表中没有项目。 下面的 sql 代码仅生成发票具有 invoiceitems。 那么任何人都可以帮我做到这一点吗??

$sql = "SELECT 
        a.cusName, 
        a.cusMob, 
        a.invoiceNo,
        a.invoiceDate, 
        a.total_VAT, 
        a.bill_tot,
        b.itemsName ,
        b.rate, 
        b.amt_vat,
        ROUND(b.amt_vat + b.amount, 2) as amount
    FROM 
        invoices a, 
        invoice_items b 
    where 
        a.invoiceID=b.invoiceid
        and a.invoiceDate between '$getfromdate' and '$gettodate' 
        and a.status IS NULL 
    order by 
        a.invoiceID desc";

【问题讨论】:

使用left join 【参考方案1】:

您应该尝试将您的 SQL 更改为较新的 JOIN notation,因为它会使这类事情变得更简单,然后您可以使用 LEFT JOIN 来表明这是一个可选表...

SELECT a.cusName, a.cusMob, a.invoiceNo,
       a.invoiceDate, a.total_VAT, a.bill_tot,
       b.itemsName ,b.rate, b.amt_vat,
       ROUND(b.amt_vat + b.amount, 2) as amount
  FROM invoices a
  LEFT JOIN invoice_items b ON a.invoiceID=b.invoiceid
  WHERE a.invoiceDate between '$getfromdate' and '$gettodate' 
      and a.status IS NULL 
  order by a.invoiceID desc

我还建议您考虑使用prepared statements,因为它们有很多优势。

【讨论】:

【参考方案2】:

如果在 invoice_items 没有值时也想要结果,则应使用左连接,如果为空:

$sql    = "SELECT a.cusName
                , a.cusMob
                , a.invoiceNo
                , a.invoiceDate
                , a.total_VAT
                , a.bill_tot
                , b.itemsName 
                , b.rate
                , b.amt_vat
                , ROUND(b.amt_vat + inull(b.amount,0), 2) as amount
            FROM invoices a
            LEFT JOIN invoice_items b ON a.invoiceID=b.invoiceid
            WHERE a.invoiceDate between '$getfromdate' 
                and '$gettodate' and a.status IS NULL 
            order by a.invoiceID desc";

您还应该避免基于 where 的旧隐式连接语法,并使用显式连接语法。这也让您可以使用左连接(外连接)。

您还应该避免在 SQL 代码中使用 php var。您面临 SQL 注入的风险。为此,请查看您的数据库驱动程序以获取准备好的语句和绑定参数。

【讨论】:

以上是关于如何根据我的要求更改 sql 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改我的 sql 查询,以便删除列中具有某些值的行 [重复]

如何根据用户选择的下拉菜单更改 PHP 中的 SQL 查询

如何使用PL / SQL更改您在FOR循环IN子句中查询的表

如何根据要求在每个其他控制器中更改 NavigationController 的 NavigationBar?

根据条件在Access的SQL查询中创建日期字段

SQL Server 在运行查询之前更改了我的字符串