В заголовке очень сумбурно описал, потому что я не очень понимаю, как это описать лучше. Вот расширенное:
Есть две таблицы: одна с постами, а в другой есть все данные для постов (это Wordpress и его таблицы _posts и _postmeta). Во всех данных структура такая: entry_id, post_id, meta_key, meta_value. Для некоторых записей из таблицы _posts есть запись в таблице _postmeta, которая соответствует условию
Но в то же время для некоторых такой записи просто не существует, даже со значением NULL. То есть по запросу получается вытащить либо те посты, для которых есть _yourls, либо те, для которых нет. Я решил это UNION'ом, получилось так:
CODE (
SQL):
скопировать код в буфер обмена
SET @start='2014-08-27 21:32:00';
SELECT * FROM (
SELECT `site_posts`.`ID` AS `id`, `site_posts`.`post_author` AS `author`, `site_posts`.`post_title` AS `title`, `site_posts`.`post_date_gmt` AS `date`, `site_postmeta`.`meta_value` AS `url`
FROM `site_posts`
LEFT OUTER JOIN `site_postmeta` ON `site_postmeta`.`post_id` = `site_posts`.`ID`
WHERE `post_date_gmt` > @start
AND `site_postmeta`.`meta_key` = '_yourls_url'
AND `post_type` = 'post'
AND `post_status` = 'publish'
AND `site_posts`.`post_author` NOT IN (202, 224, 226, 201, 200, 225)
UNION DISTINCT
SELECT `site_posts`.`ID` AS `id`, `site_posts`.`post_author` AS `author`, `site_posts`.`post_title` AS `title`, `site_posts`.`post_date_gmt` AS `date`, NULL AS `url`
FROM `site_posts`
WHERE `post_date_gmt` > @start
AND `post_type` = 'post'
AND `post_status` = 'publish'
AND `site_posts`.`post_author` NOT IN (202, 224, 226, 201, 200, 225)
AND NOT EXISTS (
SELECT * FROM `site_postmeta` WHERE `site_postmeta`.`post_id` = `site_posts`.`ID` AND `site_postmeta`.`meta_key` = '_yourls_url'
)
) AS `new_posts`
GROUP BY `author`, `title`
ORDER BY `date` DESC;
Но тут наступает некоторая задница, потому что пусть запрос отрабатывает красиво, возвращая один набор данных, но сам запрос не до конца оптимизирован и почти что не расширяем. Теперь вопросы:
Как мне можно сначала выбрать посты по одинаковым условиям из обоих запросов? Подозреваю, что тут мне помогут вложенные SELECT'ы.
Другой вопрос: как мне можно в один набор данных объединить посты, для которых есть _yourls и посты, для которых нет, так, чтобы, если _youls есть, то он выбирался, а если нет, чтобы на его месте был NULL?
Спасибо за старания понять мою писанину