我想从两个不同的mysql表中收集数据,按时间戳对结果进行排序,但不要将两个表的列合并到一行中。
一个(one_idone_someinfoone_ts
两个(two_idtwo_otherinfotwo_ts
请注意,字段two_otherinfo与one_someinfo不同,唯一共同的列是id和timestamp。
结果应该是按时间戳排序的两个表的组合,但是根据时间戳的不同,每一行应该只包含表的相应列。
例如,如果最新记录来自Tú2,则该行的TúONEone_someinfo列应为空。
我只需要从Tç1订购最新消息,并在Tç2上发布最新消息,这样表格就不相关了。我想避免使用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排序的结果应该是timestamp122222224的表星的第二个记录,然后是timestamp12222222223的表柱的第三个记录以及随后的记录。。。由于表之间有不同的字段,结果的第一行应该包含表星的列,而表柱的列应该是空的。

最佳答案

联合的列在每一行上必须具有相同的名称和数据类型。实际上,在第一个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将应用于联合的整个结果,而不仅仅是最后一个子查询。

关于mysql - MySQL从2个不相关的表中按时间戳排序选择记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7479104/

10-14 19:33