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

时间:2019-03-24 19:22:17

标签: php mysql sql

在我的sql数据库中,我有两个表,一个是Invoices,另一个表是invoiceitems。因此,我正在从发票(发票表)中获取客户详细信息以及发票项目(从发票项目表中)。 我的sql代码面临一个问题。如果发票在发票表中没有任何项目,则无法获取数据。

我想获取所有数据,包括如果发票项目表中的发票中没有项目。 在下面的sql代码中,仅生成发票的具有发票项目。 谁能帮我做到这一点?

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

2 个答案:

答案 0 :(得分:3)

您应该尝试将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,因为它们有很多优点。

答案 1 :(得分:2)

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

 server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/laravel/public;

    index index.php  index.html index.htm;

    server_name dev-localserve.co;

    location / {
            try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;

            fastcgi_pass 127.0.0.1:9000;
    }

    location ~ /\.ht {
            deny all;
    }
}

您还应避免根据位置使用旧的隐式联接sinta,并使用显式联接sintax,还应让您使用左联接(外部联接)

您还应该避免在SQL代码中使用php var ..您有可能遭受sqlinjection ..为此,请查看您的数据库驱动程序中是否存在prpared语句和bindig参数