【问题标题】:MySQL Select Records from 2 not-related Tables Ordering by TimestampMySQL 从 2 个按时间戳排序的不相关表中选择记录
【发布时间】:2011-09-21 23:32:32
【问题描述】:

我想从 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 和以下的表格帖子的第三条记录......因为表格彼此有不同的字段,结果的第一行应包含表格星星的列,而表格帖子的列应为空。

【问题讨论】:

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

标签: mysql


【解决方案1】:

UNION 的列必须在每一行的namedatatype都相同。事实上,在第一个 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】:
     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
    

    【讨论】:

    • 谢谢,我已经尝试过使用 UNION 但不幸的是表格的字段彼此不同。它们只有共同的 id 和时间戳字段。所以这个解决方案对我不起作用
    • 您能否发布您的 CREATE TABLE 代码和所需结果的示例?
    • 我在上面的回复中贴出了表格的结构,希望对您有所帮助。感谢您的回复,我是新来的
    【解决方案3】:
      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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      相关资源
      最近更新 更多