从mysql组合两个结果集


Combining two result sets from mysql

所以我知道这个网站上有很多关于这个话题的帖子,我能找到的最接近的一个是:

我可以从两行取结果并将它们合并为一行吗?

我正在做一个涉及"应收账款"answers"应付账款"的项目,但这两个项目都需要一个列表中的数据:

date | description | reference | debit | credit

我读过mySQL UNION语句用于将两个结果集合并为一个,然而,根据以下网站,这两个结果集必须在列数和类型上匹配:

http://www.w3schools.com/sql/sql_union.asp

我面临的问题是,两个结果集不具有相同的列计数,因为其中一个的信息与另一个不直接相关(这将排除UNION语句的使用)。从两个表中获取数据并根据日期对它们进行排序的最佳实践是什么?我将把下面的SQL调用作为参考:

应收账款:

SELECT tblARP.*,tblAR.invoiceID,tblAR.ledgerID
FROM Accounting_ReceivablesPayments tblARP
INNER JOIN Accounting_Receivables tblAR ON tblARP.invoiceID = tblAR.invoiceID
ORDER BY deposited
应付帐款

:

SELECT tblAPP.*,tblAP.id,tblAP.ledgerID,tblAP.tblName,tblAP.rowID,tblAP.invoice
FROM Accounting_PayablesPayments tblAPP
INNER JOIN Accounting_Payables tblAP ON tblAPP.payablesID = tblAP.id
ORDER BY deposited

更新

根据评论中的请求,以下是表的列:

Accounting_Receivables

id BIGINT PRIMARY KEY NOT NULL AUTO_INCREMENT UNIQUE,
invoiceID BIGINT NOT NULL,
amount DECIMAL(9,2) NOT NULL DEFAULT '1.00',
ledgerID BIGINT NOT NULL,
note TEXT

Accounting_ReceivablesPayments

id BIGINT PRIMARY KEY NOT NULL AUTO_INCREMENT UNIQUE,
invoiceID BIGINT NOT NULL,
received DATE NOT NULL,
type VARCHAR(10) NOT NULL,
amount DECIMAL(9,2) NOT NULL DEFAULT '1.00',
deposited DATE,
tag VARCHAR(32) NOT NULL

Accounting_Payables

id BIGINT PRIMARY KEY NOT NULL AUTO_INCREMENT UNIQUE,
paid TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
invoice BIGINT NOT NULL,
amount DECIMAL(9,2) NOT NULL DEFAULT '1.00',
terms VARCHAR(3) NOT NULL DEFAULT 'net',
due DATE,
tblName VARCHAR(48) NOT NULL,
rowID BIGINT NOT NULL,
ledgerID BIGINT NOT NULL,
note TEXT

Accounting_PayablesPayments

id BIGINT PRIMARY KEY NOT NULL AUTO_INCREMENT UNIQUE,
payablesID BIGINT NOT NULL,
created DATE NOT NULL,
type VARCHAR(10) NOT NULL,
amount DECIMAL(9,2) NOT NULL DEFAULT '1.00',
deposited DATE,
tag VARCHAR(32) NOT NULL

按照我在评论中所说的,你应该这样做

(   SELECT 
        tblARP.*,
        tblAR.invoiceID,
        tblAR.ledgerID,
        NULL, -- # -- null values for your rows to match columns
        NULL,
        NULL
    FROM `Accounting_ReceivablesPayments` tblARP
    INNER JOIN `Accounting_Receivables` tblAR ON tblARP.invoiceID = tblAR.invoiceID
    ORDER BY deposited
)
UNION ALL -- # -- union all to include everything
(   SELECT 
        tblAPP.*,
        tblAP.id,
        tblAP.ledgerID,
        tblAP.tblName,
        tblAP.rowID,
        tblAP.invoice
    FROM `Accounting_PayablesPayments` tblAPP
    INNER JOIN `Accounting_Payables` tblAP ON tblAPP.payablesID = tblAP.id
    ORDER BY deposited
)