结合mysql的两个结果集

时间:2014-08-13 16:11:04

标签: php mysql

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

Can I take the results from two rows and combine them into one?

我正在开展一个涉及应收账款的项目'和“应付账款”,但这两个都需要一个列表中的数据:

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

1 个答案:

答案 0 :(得分:1)

我在评论中说你应该这样做

(   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
)