如何根据我的要求更改 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 查询,以便删除列中具有某些值的行 [重复]
如何使用PL / SQL更改您在FOR循环IN子句中查询的表