Каков наилучший способ выполнить этот запрос? Может быть СОЮЗ

0

У меня эти четыре таблицы описаны ниже. В основном у меня есть фиды с записями, связанными с категориями, и каждая категория может быть основной категорией или нет (флаг называется "основной" ). Также каждый фид может быть партнером или нет (флаг называется "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)
)
Теги:
union

1 ответ

2
Лучший ответ

Все, что вам нужно сделать, это изменить инструкцию 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 имеет два условия, поэтому вместо запроса одного и того же набора таблиц/объединений дважды мы просто запрашиваем один раз и проверяем оба условия!

  • 0
    Спасибо! Но я получил это сообщение: # 1064 - у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с 'WITH results AS (SELECT e . *, f . titulo AS feedTitulo , f . url ' в строке 1
  • 0
    @Keyne - у вас есть точка с запятой в начале? И позвольте мне изменить имена переменных в последнем операторе select, они неверны
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню