代码之家  ›  专栏  ›  技术社区  ›  casraf

来自2个相关表的时间线

  •  0
  • casraf  · 技术社区  · 14 年前

    假设我有一个 screenshots 表和A 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 回复  |  直到 14 年前
        1
  •  4
  •   Marius    14 年前

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

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

    您可以使用 mysql_tablename PHP中的函数
    您可以将表名指示为结果集中的列

        2
  •  1
  •   gorilla    14 年前

    每当我遇到这样的问题时,如果您发现由于无法构建将提取数据的查询而无法执行某些操作,那么我就必须开始考虑您是否拥有正确的数据模型?

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

    看着那些桌子,我不得不问为什么有两张?怎么了:

    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)、回复(如果设置了父项)还是……既然模型现在允许了…一个截图,这是一个答复!!!!