2014-04-21 198 views
0

对不起,这听起来很愚蠢。现在,我只对MySQL和关系数据库有一个基本的了解。基本上我只能做一些简单的SELECT;)
和往常一样,我在发布之前做过Google和StackOverflow的研究,但是我找不到合适的答案(SO上的几乎每次都用“0”值) 。
我会尽量使它尽可能通用,以便它可能对其他人有用。
比方说,我有两个表:
用排序日期时间合并两个MySQL表

TBUY 
    qtyBuy : integer 
    dateBuy : datetime 

TSELL 
    qtySell : integer 
    dateSell : datetime 

我希望能够编写一个查询,这样我可以有一个产生qtyBuy/qtySell排序表由两个日期的“合并”,例如如果这两张表是一些项目的“历史”买卖,我想知道该项目的历史,按日期排序。
我知道,做出两个不同的SELECT,然后用你使用的任何编程语言,“手工合并”结果是相当容易的。但我想知道是否有更好的方式使用MySQL。 我想这样

SELECT * FROM(SELECT * FROM tbuy UNION ALL SELECT * FROM tsell) ORDER BY whichDate?

但我不知道如何指定“whichDate”。谢谢。

+0

这些表列出了买入和卖出单个产品的信息? –

+0

日期列将具有来自第一个子查询的名称。因为您没有使用列别名对其进行重命名,所以它会是'dateBuy'。 –

+0

对马库斯亚当斯:是的,这是一个单一产品(当然,我已经“过滤了”一个产品) – ZioBit

回答

3

你试过:

select "buy" as action, qtyBuy as item, dateBuy as actionDate 
from TBUY 
union all 
select "sell" as action, qtySell as item, dateSell as actionDate 
from TSELL 
order by actionDate 

由于我不能猜出什么是qtyBuy,我不知道你是否应该加入表格。

只要您想要一个没有整体的日期行,就需要一个带日期的额外表格。 SQL只能读取和组合值,但不能从无到有创建它们。

+0

太好了。完善。我不知道你可以“选择一个字符串常量”并按照你的喜好命名。谢谢。 – ZioBit

+0

@ZioBit:我看到了使用CONCAT生成完整SQL语句的语句。 ;-) – flaschenpost

2

而不是*使用列的名称,然后您可以将dateBuydateSell列重命名为可以说date

在声明的“订单”部分中,您可以使用新名称(dateMerged)对结果集进行排序。

SELECT qtyBuy as qtyChange, dateBuy as dateMerged FROM tbuy 
UNION ALL SELECT -1 * qtySell, dateSell FROM tsell 
ORDER BY dateMerged 

UNION的结果集conains第一个SELECT语句的COLUMNNAMES,所以你可能会使用dateBuy过,但不是在工会来讲名称...

+0

我想你还是会想要'UNION ALL'。 –

+0

我认为子选择是无用的(但它不会伤害太多),并给初学者使用保留字的提示也可以避免... – flaschenpost

+0

谢谢,我编辑了查询。但我不确定它的工作原理。 – fahrradfahrer