2011-09-20 59 views
1

我想从2个不同的mysql表中收集数据,按照时间戳排序结果,但不将两个表中的列合并到一行中。MySQL从2个不相关的表中选择记录按时间戳排序

T_ONE(one_idone_someinfoone_ts

T_TWO(two_idtwo_otherinfotwo_ts

注意,字段two_otherinfo是不一样的one_someinfo,在共同的列只有ID和时间戳。

结果应该是由时间戳排序的两个表的混合,但根据时间戳,每行应该只包含表的相应列。

例如,如果最新记录来自T_TWO那行应该有T_ONE列为空的one_someinfo列。

我只需要订购来自T_ONE的最新消息和发布在T_TWO上的最新消息,因此这些表格无关。我想避免使用2个查询,然后通过使用PHP的时间戳来合并和排序结果。有没有人知道这个解决方案?在此先感谢


这是表的结构

CREATE TABLE `posts` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `fromid` int(10) NOT NULL, 
    `toteam` int(10) NOT NULL, 
    `banned` tinyint(1) NOT NULL default '0', 
    `replyid` int(15) default NULL, 
    `cont` mediumtext NOT NULL, 
    `timestamp` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE `stars` (
    `id` int(10) unsigned NOT NULL auto_increment, 
    `daynum` int(10) NOT NULL, 
    `userid` int(10) NOT NULL, 
    `vote` tinyint(2) NOT NULL default '3', 
    `timestamp` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

INSERT INTO `posts` (`fromid`, `toteam`, `banned`, `replyid`, `cont`, `timestamp`) VALUES(5, 12, 0, 0, 'mess posted#1', 1222222220); 
INSERT INTO `posts` (`fromid`, `toteam`, `banned`, `replyid`, `cont`, `timestamp`) VALUES(5, 12, 0, 0, 'mess posted#2', 1222222221); 
INSERT INTO `posts` (`fromid`, `toteam`, `banned`, `replyid`, `cont`, `timestamp`) VALUES(5, 12, 0, 0, 'mess posted#3', 1222222223); 

INSERT INTO `stars` (`daynum`, `userid`, `vote`, `timestamp`) VALUES(3, 160, 4, 1222222222); 
INSERT INTO `stars` (`daynum`, `userid`, `vote`, `timestamp`) VALUES(4, 180, 3, 1222222224); 

通过timestamp DESC结果排序应该是台星与timestamp 1222222224然后表职位的第三条记录的第二个记录与timestamp 1222222223以及...因为表格之间有不同的字段,所以结果的第一行应该包含表格列的列,而表格列的列应该是空的。

+0

只需编辑您的问题,如果您需要提供其他信息。 –

回答

1

一个UNION 的列必须上的每一行相同数据类型。事实上,在第一个UNION子查询中声明列别名,因为它忽略了在后续子查询中重命名列的任何尝试。

如果您需要两个子查询中的列不同,请将NULL作为占位符。以下是一个示例,获取公共列id和时间戳,然后从每个子查询中获取一个自定义列。

(SELECT p.id, p.timestamp AS ts, p.fromid, NULL AS daynum FROM posts) 
UNION 
(SELECT s.id, s.timestamp,  NULL,  s.daynum,  FROM stars) 
ORDER BY ts DESC 

也把括号中的子查询,所以最后ORDER BY适用于联盟的整体结果,而不仅仅是最后的子查询。

1
SELECT one_id AS id, one_someinfo AS someinfo, one_ts AS ts 
UNION 
SELECT two_id AS id, two_someinfo AS someinfo, two_ts AS ts 
ORDER BY ts 
+0

谢谢,我已经尝试过UNION,但不幸的是表格的字段与彼此不同。他们只有ID和时间戳字段的共同点。因此,该解决方案对我无效 –

+0

您可以发布您的CREATE TABLE代码和期望结果的示例吗? –

+0

我在上面的回复中发布了表格的结构,希望它会有所帮助。谢谢你的回应,我是新来的 –

0
SELECT one_id AS id 
     , one_someinfo AS one_someinfo 
     , NULL   AS two_someinfo 
     , one_ts AS ts 
    FROM t_ONE 
UNION ALL 
    SELECT two_id 
     , NULL 
     , two_someinfo 
     , two_ts 
    FROM t_TWO 
ORDER BY ts 
相关问题