Как вывести данные из нескольких таблиц в порядке по create_time все вместе - PullRequest
0 голосов
/ 20 июля 2011

Использование предложения order by для вывода данных в одну таблицу очень удобно, но как вывести данные из разных таблиц по порядку?

Видите, у меня есть таблица article post photo comment для хранения пользовательских данных, и я хочу показать их в порядке времени на их домашней странице.

Как это сделать?

Извините, я зеленая рука, и я не знаю, что для ответа на этот вопрос нужно определение таблицы. Вот оно одно из определения таблицы:

| tbl_post | CREATE TABLE `tbl_post` (
  `post_id` int(11) NOT NULL AUTO_INCREMENT,
  `bench` int(11) NOT NULL,
  `author` int(7) NOT NULL,
  `tag` varchar(45) DEFAULT NULL,
  `title` varchar(45) NOT NULL,
  `content` text NOT NULL,
  `create_time` datetime NOT NULL,
  PRIMARY KEY (`post_id`),
  KEY `post_id` (`post_id`),
  KEY `author` (`author`),
  KEY `author_2` (`author`),
  KEY `bench` (`bench`),
  CONSTRAINT `tbl_post_ibfk_1` FOREIGN KEY (`author`) REFERENCES `tbl_user` (`id
`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `tbl_post_ibfk_2` FOREIGN KEY (`bench`) REFERENCES `tbl_bench` (`be
nch_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 |

tbl_article

| tbl_article | CREATE TABLE `tbl_text` (
  `article_id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(50) NOT NULL,
  `content` text NOT NULL,
  `tag` varchar(45) DEFAULT NULL,
  `author` int(7) NOT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`article_id`),
  KEY `author` (`author`),
  KEY `create_time` (`create_time`),
  CONSTRAINT `tbl_text_ibfk_1` FOREIGN KEY (`author`) REFERENCES `tbl_user` (`id
`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

tbl_photo

| tbl_photo | CREATE TABLE `tbl_photo` (
  `photo_id` int(11) NOT NULL AUTO_INCREMENT,
  `author` int(7) NOT NULL,
  `description` varchar(120) DEFAULT NULL,
  `tag` varchar(45) DEFAULT NULL,
  `name` varchar(45) DEFAULT NULL,
  `file_name` char(132) DEFAULT NULL,
  PRIMARY KEY (`photo_id`),
  KEY `author` (`author`),
  CONSTRAINT `tbl_photo_ibfk_1` FOREIGN KEY (`author`) REFERENCES `tbl_user` (`i
d`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

tbl_post_comment

| tbl_post_comment | CREATE TABLE `tbl_post_comment` (
  `post_comment_id` int(11) NOT NULL AUTO_INCREMENT,
  `post` int(11) NOT NULL,
  `author` int(7) NOT NULL,
  `content` varchar(1000) NOT NULL,
  `parent` int(11) DEFAULT NULL,
  `create_time` datetime NOT NULL,
  PRIMARY KEY (`post_comment_id`),
  KEY `post` (`post`),
  KEY `author` (`author`),
  CONSTRAINT `tbl_post_comment_ibfk_1` FOREIGN KEY (`post`) REFERENCES `tbl_post
` (`post_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `tbl_post_comment_ibfk_2` FOREIGN KEY (`author`) REFERENCES `tbl_us
er` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |

1 Ответ

0 голосов
/ 20 июля 2011

Просто убедитесь, что все подзапросы имеют одинаковое количество полей и в одинаковом порядке:

SELECT 'post' AS type
     , p.post_id AS id
     , p.author
     , p.create_time
FROM tbl_post AS p
WHERE author = 42

UNION ALL

SELECT 'article' AS type
     , a.article_id AS id
     , a.author
     , a.create_time
FROM tbl_article AS a
WHERE author = 42

UNION ALL

SELECT 'photo' AS type
     , ph.photo_id AS id
     , ph.author
     , ph.create_time
FROM tbl_photo AS ph
WHERE author = 42

UNION ALL

SELECT 'comment' AS type
     , c.comment_id AS id
     , c.author
     , c.create_time
FROM tbl_comment AS c
WHERE author = 42

ORDER BY create_time
...