2010-03-05 46 views
0

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

如何从两个表中选择数据,按其发布时间排序,降序排列;例如,我可以发布帖子,发表一些评论,然后发布另一篇帖子;因为那将是时间线的发生?

通常从两者合并选择表格;但我不希望这种情况发生。关于这个问题,我还需要表格来区分。这里的结构表...

-- 
-- 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重复,但我没有发现有该解决方案为我工作。

在此先感谢! :)

回答

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函数获取一个字段的表名,您可指示表名作为列结果集

+0

我会玩这个,看看它是如何适合的 - 到目前为止它正在组织行的方式有几个缺点 - 谢谢!如果一切都变好,我会将其标记为答案:) – casraf 2010-03-05 11:57:04

+0

刚看了一下mysql_tablename,似乎被弃用?另外,我将结果缓存在一个数组中,我认为它不会起作用 – casraf 2010-03-05 12:12:35

+2

使用“union all”而不是“union”来避免隐式的额外“distinct”步骤 – araqnid 2010-03-05 13:40:53

1

每当我遇到像这样的问题时,您发现无法执行某些操作,因为您无法构建将提取数据的查询,我必须开始想知道您是否拥有正确的数据模式L·

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

看着这些表,我不得不问为什么有两个呢?出了什么问题:

 
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; 

这将让你做你想做的,很容易告诉如果它是一个截屏(如果分机设置),回复(如果家长设置)或...因为模型现在允许它...这是一个答复的截图!

+0

我的需求并不需要这个结构,哈哈:P我不需要截图这是一个回复,而且我更容易分开组织它们。 – casraf 2010-03-05 11:54:00

+0

噢,在我决定为RSS提要制作一个连接的时间线之前,我的结构非常棒。该网站本身功能和工作几乎完美无瑕,这只是我想给它的一个提升。 – casraf 2010-03-05 12:09:27