我想从2个不同的mysql表中收集数据,这些表通过时间戳排序结果,但没有在一行中合并2个表的列。
T_ONE(one_id
,one_someinfo
,one_ts
)
T_TWO(two_id
,two_otherinfo
,two_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的表格帖子的第三条记录,以及......之后的表格彼此有不同的字段,结果的第一行应该包含表星的列,而表格的列应该是空的。
答案 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