Извлечение результатов из разных таблиц с одинаковой структурой - PullRequest
1 голос
/ 03 июля 2011

Меня спрашивают, могу ли я получить результат из 18 различных баз данных Wordpress, объединенных в одну базу данных с конфликтующими именами , отфильтровать их, а затем поиграть с результатами в PHP.

Например:

У меня есть данные (записи) в ara_posts, val_posts и car_posts (все они - таблицы, в именах столбцов которых есть post_name, post_type, post_status и post_date). Я хочу выбрать все данные из этих таблиц и отфильтровать результат (показывать только результаты, имеющие post_type = 'post').

Что я хочу сделать с результатом, так это сравнить даты и получить последние 3 сообщения из всех этих 18 таблиц, которые имеют статус «опубликовать» и тип сообщения «публикация».

Как это возможно?

Ответы [ 4 ]

2 голосов
/ 03 июля 2011

Как предлагается в ответе на этот вопрос очень похож на ваш , вы, вероятно, можете использовать оператор UNION .Как то так:

(SELECT post_name, post_type, post_status, post_date FROM ara_posts WHERE post_status='publish' AND post_type='post')
UNION ALL
(SELECT post_name, post_type, post_status, post_date FROM val_posts WHERE post_status='publish' AND post_type='post')
UNION ALL
(...)
ORDER BY post_date DESC
LIMIT 3
1 голос
/ 04 июля 2011

Я бы определил представление, основанное на запросах объединения в других частях ответов (но без указания where и limit).Затем вы можете запросить представление напрямую.Представление - это аналог функции, это ваша основная единица повторного использования для баз данных.

1 голос
/ 04 июля 2011

Я бы добавил часть ORDER BY post_date DESC LIMIT 3 во все подзапросы.таким образом, все подзапросы будут использовать индекс поля post_date соответствующей таблицы, а основной запрос должен будет отсортировать только строки 18x3.

Если у вас есть только этот основной запрос, он должен будет извлечь все (тысячи? Миллионы?) Строк и затем отсортировать.Я не уверен, что оптимизатор достаточно умен, чтобы этого не делать:

( SELECT post_name, post_type, post_status, post_date, 'ara' AS source 
  FROM ara_posts 
  WHERE post_status='publish' 
    AND post_type='post'
  ORDER BY post_date DESC
  LIMIT 3
)
UNION ALL
( SELECT post_name, post_type, post_status, post_date, 'val' AS source 
  FROM val_posts
  WHERE post_status='publish' 
    AND post_type='post'
  ORDER BY post_date DESC
  LIMIT 3
)
UNION ALL
(...)
ORDER BY post_date DESC
LIMIT 3

И Денис очень хорошо знает, как определить источник конечных результатов.

1 голос
/ 03 июля 2011

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

(SELECT 'ara' as dbname, post_name, post_type, post_status, post_date FROM ara_posts WHERE post_status='publish' AND post_type='post') 
UNION ALL 
(SELECT 'val' as dbname, post_name, post_type, post_status, post_date FROM val_posts WHERE post_status='publish' AND post_type='post') 
UNION ALL (...) ORDER BY post_date DESC LIMIT 3 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...