MySQL从2个不相关的表中选择记录按时间戳排序

时间:2011-09-20 01:24:29

标签: mysql

我想从2个不同的mysql表中收集数据,这些表通过时间戳排序结果,但没有在一行中合并2个表的列。

T_ONE(one_idone_someinfoone_ts

T_TWO(two_idtwo_otherinfotwo_ts

请注意,字段two_otherinfo与one_someinfo不同,唯一的共同列是id和timestamp。

结果应该是按时间戳排序的两个表的混合,但每行(取决于时间戳)应仅包含表的相应列。

例如,如果最新记录来自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的表格帖子的第三条记录,以及......之后的表格彼此有不同的字段,结果的第一行应该包含表星的列,而表格的列应该是空的。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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适用于UNION的整个结果,而不仅仅是最后一个子查询。

答案 2 :(得分: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