来自2个相关表格的时间表

时间:2010-03-05 11:16:34

标签: php sql mysql

假设我有一个screenshots表和一个replies表。所以:每个截图都可以有多个回复(一对多)。现在,我想创建两者的组合时间轴,但实际上,它们是非常不相关的(在结构上)。

如何从两个表中选择数据,按发布时间排序,降序;例如,我可以有一个帖子,一些评论,然后另一个帖子;因为这会是时间表的发生方式吗?

通常从两者中选择合并表格;但我不希望这种情况发生。在这个问题上,我还需要表格可以区分。这是表格的结构......

--
-- Table structure for table `screenshots`
--

CREATE TABLE IF NOT EXISTS `screenshots` (
  `id` int(11) NOT NULL auto_increment,
  `user` int(11) NOT NULL,
  `description` text NOT NULL,
  `time` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `ext` varchar(4) NOT NULL default 'png',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;

-- --------------------------------------------------------

--
-- Table structure for table `screenshot_replies`
--

CREATE TABLE IF NOT EXISTS `screenshot_replies` (
  `id` int(11) NOT NULL auto_increment,
  `user` int(11) NOT NULL,
  `parent` int(11) NOT NULL,
  `time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `text` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=27 ;

注意:我意识到这可能与this question重复,但我没有找到适合我的解决方案。

提前致谢! :)

2 个答案:

答案 0 :(得分:4)

在这种情况下你应该使用UNION

(SELECT id, time, 'screenshots' as tableName FROM screenshots)
UNION
(SELECT id, time, 'replies' as tableName FROM screenshot_replies)
ORDER BY time ASC

您可以使用php中的mysql_tablename函数获取字段的表名
您可以将表名指定为结果集中的列

答案 1 :(得分:1)

每当我遇到这样的问题时,你发现它无法做某事,因为你无法构建一个可以提取数据的查询,我不得不开始想知道你有正确的数据模型吗? / p>

从你想要提取的数据开始,然后建立一个允许这样做的模型,而不是反过来,从长远来看,你会发现它更容易,也可能更快的性能和更好的灵活性。 / p>

看着那些桌子,我不得不问为什么有两个?出了什么问题:

CREATE TABLE IF NOT EXISTS `screenshots` (
  `id` int(11) NOT NULL auto_increment,
  `user` int(11) NOT NULL,
  `description` text NOT NULL,
  `time` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `ext` varchar(4) default 'png',
  `parent` int(11),
  `text` text,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

这将允许你做你想做的事,轻松告诉它是否是一个屏幕截图(如果设置了ext),回复(如果设置了父设置)或......因为模型现在允许它...截图这是一个回复!!!