Mysql查询排序和合并两个表

时间:2015-03-20 01:28:18

标签: php mysql database

我的mysql数据库中有两个名为forum_topics和forum_replies的表。 我希望概述最新的帖子/回复,例如:http://prntscr.com/6ixtz4

为了做到这一点,我需要一种方法来使它按两个表中的时间排序,如果在结果中有一个forum_reply,它需要从forum_topics中获取它的主题。

我怎样才能做到这一点?我没有使用mysql查询来进行此工作。

    CREATE TABLE IF NOT EXISTS `forum_topics` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `topic` varchar(255) NOT NULL,
  `thread` varchar(255) NOT NULL,
  `level` int(2) NOT NULL DEFAULT '0',
  `creator` int(255) NOT NULL,
  `time` varchar(255) NOT NULL,
  `innlegg` text NOT NULL,
  `ip` varchar(255) NOT NULL,
  `locked` enum('yes','no') NOT NULL DEFAULT 'no',
  `deleted` enum('yes','no') NOT NULL DEFAULT 'no',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;


CREATE TABLE IF NOT EXISTS `forum_replies` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `topicid` int(255) NOT NULL,
  `userid` int(255) NOT NULL,
  `time` int(255) NOT NULL,
  `reply` text NOT NULL,
  `deleted` enum('yes','no') NOT NULL DEFAULT 'no',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ;

exampledata:

 in table forum_topics

id |topic| time|
1  | test | 10
2  |  test2 | 29



   in table forum replies:
id | topicid | time |

1   |  1   | 18
2   |  2   | 28

在这个例子中,我希望结果可以这样排序:

10
18
28
29

如果forum_replies是其中一个结果,则需要来自forum_topics的一些数据,但如果forum_topics是其中一个结果,则不需要来自forum_replies的任何数据。

topicid是主题的forum_topics中的id,回复是对该主题的响应。

所以最后我想在图像中创建示例输出。

编辑: 这将是一个包含在以下顺序的结果:     10     18     28     29

2 个答案:

答案 0 :(得分:1)

通过在示例数据集中加载数据,这将从两个表中获取时间,但是从两者中对时间进行排序,就好像它们在一个表中一样。以下查询获取结果,然后按时间顺序对它们进行排序。由于两个表具有相同的结构,因此您可以" union"它们就像它们是一张桌子一样,按时间排序" order_by"

select time
from forum_topics
UNION
select time
from forum_replies
order by time

注意:我能够在上面的请求中加载两个表,但每个表都没有最后一行。换句话说,我修剪了引用引擎的部分,然后只是创建了表格,然后输入了提供的数据..

答案 1 :(得分:0)

对不起,我不得不说论坛帖子的表结构不正确。在您的情况下,您将很难根据主题和回复对帖子进行排序。我建议像这样的表结构:

CREATE TABLE IF NOT EXISTS `forum_topics` (
  `tid` int(255) NOT NULL AUTO_INCREMENT, // Topic ID
  `tsubject` varchar(255) NOT NULL, // Topic Subject
  `level` int(2) NOT NULL DEFAULT '0',
  `creator` int(255) NOT NULL,
  `innlegg` text NOT NULL, // I don't know what this means ...
  `locked` enum('yes','no') NOT NULL DEFAULT 'no',
  `deleted` enum('yes','no') NOT NULL DEFAULT 'no',
  PRIMARY KEY (`tid`),
  UNIQUE KEY `id` (`tid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5;

CREATE TABLE IF NOT EXISTS `forum_posts` (
  `pid` int(255) NOT NULL AUTO_INCREMENT,
  `tid` int(255) NOT NULL,
  `userid` int(255) NOT NULL,
  `time` int(255) NOT NULL,
  `pcontent` text NOT NULL, // Post Content
  `isauthorpost` int(1) NOT NULL, // Optional: If this is the first post of the topic
  `deleted` enum('yes','no') NOT NULL DEFAULT 'no',
  PRIMARY KEY (`pid`),
  UNIQUE KEY `id` (`pid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ;

所以现在你将有第一个主题ID。您可以使用ORDER BY pid搜索所有回复,有关主题详情,您可以使用LEFT JOIN forum_topicsINNER JOIN完成回复。