MYSQL SELECT UNION ALL объединение выборки из двух таблиц

Mysql UNION SELECTДопустим у нас есть две таблицы с данными. Как одним запросом к БД объединить данные из этих двух таблиц?
Для этого используем оператор UNION ALL.

 

В одной таблице (`news`) новости, в другой  – сообщения размещенные пользователями. Для ленты последних сообщений, совместно с новостями организуем такой запрос к БД:

 


(SELECT `news_id`,`news_autor`,`news_subject`,`news_text`,`news_time` FROM `news` ORDER BY `news_time` DESC LIMIT 20)
UNION ALL
(SELECT `post_id`,`post_autor`,`post_subject`,`post_text`,`post_time` FROM `forum` ORDER BY `post_time`  DESC LIMIT 20) ORDER BY `news_time` DESC

Выбираем 20 последних новостей и двадцать последних сообщений (LIMIT 20), отсортированных по времени размещения (ORDER BY `news_time` DESC и ORDER BY `news_time` DESC), объединяем результаты (UNION ALL) и снова сортируем по времени (ORDER BY `news_time` DESC - от более новых к более старым).

Здесь надо помнить , что количество выбираемых полей ( `news_id`,`news_autor`…)  должно совпадать в первой и второй таблице (в данном примере по пять в каждой). Если в таблице `news` у нас бы отсутствовало поле `news_autor` , его можно было бы заменить «нулём» (NULL):

(SELECT `news_id`,NULL,`news_subject`,`news_text`,`news_time` FROM `news` ORDER BY `news_time` DESC LIMIT 20)
UNION ALL
(SELECT `post_id`,`post_autor`,`post_subject`,`post_text`,`post_time` FROM `forum` ORDER BY `post_time`  DESC LIMIT 20) ORDER BY `news_time` DESC

В PHP, это выражение, выполненное с помощью функции  mysql_query(), выглядело бы так:

$sql = mysql_query("(SELECT `news_id`,NULL,`news_subject`,`news_text`,`news_time` FROM `news` ORDER BY `news_time` DESC LIMIT 20)
UNION ALL
(SELECT `post_id`,`post_autor`,`post_subject`,`post_text`,`post_time` FROM `forum` ORDER BY `post_time`  DESC LIMIT 20) ORDER BY `news_time` DESC") or die('SQL Error');

Опубликовано 04.12.2012 в 17:13 · Автор Вебдизайнеру, сисадмину, вебмастеру · Ссылка
Рубрики: MySQL, PHP программирование · Теги: , , , , ,