加入2张桌子进行取款和存款?

时间:2013-09-17 08:08:39

标签: mysql sql

我见过很多人为提款和存款创建一个唯一的表格,并且用“w”或“d”填写的类别字段用于指定任何记录。

由于我需要W或D的不同字段,我决定创建2个不同的表,但现在我不知道如何加入它们。

他们有一个公共字段“timestamp”(注册的时间戳应该是唯一的)

如何在mysql中创建单个表,如:

时间戳---数量宽幅提取---金额存款???

我知道左或右连接但我需要双方加入我认为:S

3 个答案:

答案 0 :(得分:1)

模拟全外连接:

SELECT t1.timestamp, t1.value as withdrawals, t2.value as deposits FROM t1
LEFT JOIN t2 ON t1.timestamp = t2.timestamp
UNION
SELECT t1.timestamp, t1.value as withdrawals, t2.value as deposit FROM t1
RIGHT JOIN t2 ON t1.timestamp = t2.timestamp 

没有加入:

select timestamp, sum(withdrawal) as withdrawal, sum(deposit) as deposit 
from 
(
select timestamp, withdrawal,0 as deposit from withdrawal
union all
select timestamp, 0 as withdrawal, deposit from deposit
) group by timestamp

答案 1 :(得分:1)

由于MySQL不支持FULL OUTER JOIN,为什么不为提款和存款保留单表?

当你需要两列时,它只是一个

SELECT
   ts_col,
   MIN(CASE WHEN TransactionIndicator = 'D' THEN amount END) AS Deposits,
   MIN(CASE WHEN TransactionIndicator = 'W' THEN amount END) AS withDrawal
FROM tab
GROUP BY ts_col

如果您不需要同时提取和存款,则不需要MIN / GROUP BY。

顺便说一句,单笔交易的存款和取款价值是相同的,不是吗?

答案 2 :(得分:1)

做出一些假设,断言加入毫秒是荒谬的,fiddle here

CREATE TABLE Withdrawl
(
    Timestamp TIMESTAMP PRIMARY KEY,
    Amount Decimal(60, 4)
);

CREATE TABLE Deposit
(
    Timestamp TIMESTAMP PRIMARY KEY,
    Amount Decimal(60, 4)
);

SELECT
        Timestamp,
        -Amount
    FROM
        Withdrawl
UNION ALL
SELECT
        Timestamp,
        Amount
    FROM
        Deposit
    ORDER BY
        Timestamp ASC;

this

怎么样?
SELECT
        Timestamp,
        Amount,
        NULL
    FROM
        Withdrawl
UNION ALL
SELECT
        Timestamp `time stamp`,
        NULL `amount withdrawal`,
        Amount `amount deposits`
    FROM
        Deposit
    ORDER BY
        Timestamp ASC;