У меня эти четыре таблицы описаны ниже. В основном у меня есть фиды с записями, связанными с категориями, и каждая категория может быть основной категорией или нет (флаг называется "основной" ). Также каждый фид может быть партнером или нет (флаг называется "parceiro" ).
Я хочу выбрать все записи фида из каналов partrners, поэтому у меня есть следующее:
SELECT `e` . * , `f`.`titulo` AS `feedTitulo` , `f`.`url` AS `feedUrl`
FROM `feed_entries` AS `e`
INNER JOIN `feeds` AS `f` ON e.feed_id = f.id
INNER JOIN `entries_categorias` AS `ec` ON ec.entry_id = e.id
INNER JOIN `categorias` AS `c` ON ec.categoria_id = c.id
WHERE
e.deleted =0
AND
f.parceiro =1
GROUP BY `e`.`id`
ORDER BY `e`.`date` DESC
LIMIT 5
Теперь мне нужно включить в этот результат все записи из нигде партнеров, которые находятся в основных категориях, я имею в виду только записи в основных категориях. Итак, запрос ниже:
SELECT `e` . * , `f`.`titulo` AS `feedTitulo` , `f`.`url` AS `feedUrl`
FROM `feed_entries` AS `e`
INNER JOIN `feeds` AS `f` ON e.feed_id = f.id
INNER JOIN `entries_categorias` AS `ec` ON ec.entry_id = e.id
INNER JOIN `categorias` AS `c` ON ec.categoria_id = c.id
WHERE
e.deleted =0
AND
c.principal =1
AND
f.parceiro =0
GROUP BY `e`.`id`
ORDER BY `e`.`date` DESC
LIMIT 5
Мне нужно объединить эти результаты в одном запросе с ограничением 5, упорядоченным по дате.
Является ли UNION лучшим решением, если да, как писать запрос?
CREATE TABLE categorias (
id int(11) NOT NULL auto_increment,
nome varchar(100) collate utf8_unicode_ci NOT NULL,
principal int(1) NOT NULL default '0',
PRIMARY KEY (id),
UNIQUE KEY nome (nome)
)
CREATE TABLE entries_categorias (
id int(11) NOT NULL auto_increment,
entry_id int(11) NOT NULL,
categoria_id int(11) NOT NULL,
PRIMARY KEY (id),
KEY entry_id (entry_id),
KEY categoria_id (categoria_id)
)
CREATE TABLE feeds (
id int(11) NOT NULL auto_increment,
categoria_id int(11) NOT NULL,
titulo varchar(255) collate utf8_unicode_ci NOT NULL,
link varchar(255) collate utf8_unicode_ci NOT NULL,
url varchar(255) collate utf8_unicode_ci NOT NULL,
parceiro int(1) NOT NULL,
PRIMARY KEY (id),
KEY categoria_id (categoria_id)
)
CREATE TABLE feed_entries (
id int(11) NOT NULL auto_increment,
feed_id int(11) NOT NULL COMMENT 'Testando os comentários',
titulo varchar(255) collate utf8_unicode_ci NOT NULL,
descricao text collate utf8_unicode_ci NOT NULL,
slug varchar(255) collate utf8_unicode_ci NOT NULL,
link varchar(255) collate utf8_unicode_ci NOT NULL,
permaLink varchar(255) collate utf8_unicode_ci NOT NULL,
html text collate utf8_unicode_ci NOT NULL,
`date` datetime NOT NULL,
created_at datetime NOT NULL,
deleted int(1) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY permaLink (permaLink),
KEY feed_id (feed_id)
)
Все, что вам нужно сделать, это изменить инструкцию WHERE в запросе:
SELECT `e`.*, `f`.`titulo` as `feedTitulo`, `f`.`url` as `feedUrl`
FROM `feed_entries` as `e`
INNER JOIN `feeds` as `f`
ON e.feed_id = f.id
INNER JOIN `entries_categorias` as `ec`
ON ec.entry_id = e.id
INNER JOIN `categorias` AS `c`
ON ec.categoria_id=c.id
WHERE (e.deleted = 0 AND f.parceiro = 1)
OR (e.deleted = 0 AND c.principal=1 AND f.parceiro = 0)
GROUP BY `e`.`id`
ORDER BY `e`.`date` desc
LIMIT 5
Новый оператор where имеет два условия, поэтому вместо запроса одного и того же набора таблиц/объединений дважды мы просто запрашиваем один раз и проверяем оба условия!
e
. *,f
.titulo
ASfeedTitulo
,f
.url
' в строке 1