php - 这个 'paid or unpaid invoices' MySQL 查询可能吗?

标签 php mysql

我正在尝试生成一个显示“已付款”发票的查询。我的查询不起作用,这意味着其中存在错误,或者我试图以这种方式实现的目标是不可能的。

// paid

$statement = "accounts_invoice i 
               INNER JOIN customer_type ct on i.invoice_customer_type = ct.customer_type_id 
               LEFT JOIN accounts_invoice_payment ip on i.invoice_id = ip.invoice_payment_invoice_id 
              WHERE invoice_posted='1' 
                AND (i.invoice_total_amount_exc_vat + i.invoice_total_vat_amount) = ip.TotalPayments" 
              . $where 
              . " ORDER BY invoice_id DESC";

$invoice_details_query = mysqli_query($con,
          "SELECT i.*, ct.customer_type_name, 
                  ip.invoice_payment_amount AS TotalPayments 
           FROM {$statement} 
           LIMIT {$startpoint} , {$per_page}") 
        or die(mysql_error());

在这种情况下,$where 字符串为空,您可以根据需要将其删除。您还可以删除“LIMIT”,因为这纯粹用于分页。

我只是想制作一个页面来显示已付或未付的发票,考虑到理论上听起来如此简单,这让我发疯!

数据库结构;

-- phpMyAdmin SQL Dump
-- version 4.0.10.7
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Aug 08, 2015 at 05:17 PM
-- Server version: 5.1.73-cll
-- PHP Version: 5.4.31

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Database: `propsyst_atlas`
--

-- --------------------------------------------------------

--
-- Table structure for table `accounts_invoice`
--

CREATE TABLE IF NOT EXISTS `accounts_invoice` (
  `invoice_id` int(11) NOT NULL AUTO_INCREMENT,
  `invoice_customer_type` tinyint(4) DEFAULT NULL,
  `invoice_customer` int(11) DEFAULT NULL,
  `invoice_date` date DEFAULT NULL,
  `invoice_due_date` date DEFAULT NULL,
  `invoice_property_id` int(11) DEFAULT NULL,
  `invoice_tenancy_id` int(11) DEFAULT NULL,
  `invoice_branch` int(11) DEFAULT NULL,
  `invoice_payment_terms` tinyint(4) DEFAULT NULL,
  `invoice_notes` text COLLATE utf8_bin,
  `invoice_total_amount_exc_vat` decimal(10,2) DEFAULT NULL,
  `invoice_total_vat_amount` decimal(10,2) DEFAULT NULL,
  `invoice_posted` tinyint(4) DEFAULT '0',
  `invoice_date_created` datetime DEFAULT NULL,
  `invoice_date_updated` datetime DEFAULT NULL,
  `invoice_date_posted` datetime DEFAULT NULL,
  `invoice_created_by` int(11) DEFAULT NULL,
  `invoice_updated_by` int(11) DEFAULT NULL,
  `invoice_posted_by` int(11) DEFAULT NULL,
  PRIMARY KEY (`invoice_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=87 ;


-- phpMyAdmin SQL Dump
-- version 4.0.10.7
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Aug 08, 2015 at 05:18 PM
-- Server version: 5.1.73-cll
-- PHP Version: 5.4.31

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Database: `propsyst_atlas`
--

-- --------------------------------------------------------

--
-- Table structure for table `accounts_invoice_payment`
--

CREATE TABLE IF NOT EXISTS `accounts_invoice_payment` (
  `invoice_payment_id` int(11) NOT NULL AUTO_INCREMENT,
  `invoice_payment_date` date DEFAULT NULL,
  `invoice_payment_amount` decimal(10,2) DEFAULT NULL,
  `invoice_payment_method` tinyint(4) DEFAULT NULL,
  `invoice_payment_invoice_id` int(11) DEFAULT NULL,
  `invoice_payment_notes` text COLLATE utf8_bin,
  `invoice_payment_date_created` datetime DEFAULT NULL,
  `invoice_payment_date_updated` datetime DEFAULT NULL,
  `invoice_payment_created_by` int(11) DEFAULT NULL,
  `invoice_payment_updated_by` int(11) DEFAULT NULL,
  PRIMARY KEY (`invoice_payment_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=71 ;

-- phpMyAdmin SQL Dump
-- version 4.0.10.7
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Aug 08, 2015 at 05:58 PM
-- Server version: 5.1.73-cll
-- PHP Version: 5.4.31

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Database: `propsyst_atlas`
--

-- --------------------------------------------------------

--
-- Table structure for table `customer_type`
--

CREATE TABLE IF NOT EXISTS `customer_type` (
  `customer_type_id` int(11) NOT NULL AUTO_INCREMENT,
  `customer_type_name` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`customer_type_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=4 ;

最佳答案

实际上您的查询是

SELECT
    i.*,
    ip.invoice_payment_amount AS TotalPayments
FROM accounts_invoice i 
LEFT JOIN accounts_invoice_payment ip
    ON i.invoice_id = ip.invoice_payment_invoice_id 
WHERE invoice_posted='1' 
AND (i.invoice_total_amount_exc_vat + i.invoice_total_vat_amount) = ip.TotalPayments
ORDER BY invoice_id DESC

并且该查询失败,因为 where 语句中的 ip.TotalPayments 是未知列。您需要使用原始名称ip.invoice_ payment_amount。别名仅在返回的集合中使用,而不在查询本身中使用。

此外,您的数据库设计还可以改进。首先,我建议使用 InnoDB 而不是 MyISAM。这允许您使用外键,因此表之间实际上存在关系。

此外,我会将 WHERE 子句的 AND 部分移动到 ON 子句,如下所示:

SELECT
    i.*,
    ip.invoice_payment_amount AS TotalPayments
FROM accounts_invoice i 
LEFT JOIN accounts_invoice_payment ip
    ON i.invoice_id = ip.invoice_payment_invoice_id 
    AND (i.invoice_total_amount_exc_vat + i.invoice_total_vat_amount) = ip.invoice_payment_amount
WHERE invoice_posted='1' 
ORDER BY invoice_id DESC

SELECT * FROM A LEFT JOIN B ON A.id = B.a_id 的结果包含 A 的每一行以及 B< 的匹配行。如果 B 没有与 A 中的行匹配的行,则 B 中的列值为 NULL。如果您不希望这样,而只想在 B 中具有匹配行的 A 行,则应使用 INNER JOIN

关于php - 这个 'paid or unpaid invoices' MySQL 查询可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31895937/

相关文章:

mysql - 加入限制结果的查询

sql - MySql Select 语句根据关键字的主 ID 区分最新日期值

php - MySQLi 订阅列表表

php - SQL查询优先考虑php数组中的值

php - 无法解析主机名(即使添加 INTERNET 权限后)

php - 将 2 个下拉列表的值合并到 1 个 MySQL 查询中

php - 用户输入、PHP、Javascript 和安全

php - 当用户从选择框中选择选项时更改输入字段的值

mysql - 使用 slice 执行 sql 准备语句

php: 定义的用法