2010-08-30 3 views
0

J'ai ces quatre tables décrites ci-dessous. Fondamentalement, j'ai des flux avec des entrées liées à des catégories, et chaque catégorie peut être une catégorie principale ou non (drapeau nommé comme "principal"). Chaque aliment peut également être un aliment partenaire ou non (drapeau nommé "parceiro").Quelle est la meilleure façon d'effectuer cette requête? Peut-être UNION

Je veux sélectionner toutes les entrées d'alimentation à partir partrners flux, donc je ceci:

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 

Maintenant je dois inclure dans ce résultat toutes les entrées de non partenaires flux qui sont dans les catégories principales, je veux dire, seulement les entrées dans les catégories principales. Ainsi, la requête ci-dessous faire:

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 

je dois fusionner ces résultats dans une requête avec limite de 5 ordened par date.

Est-ce que UNION est la meilleure solution, si oui, comment écrire la requête?

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) 
) 

Répondre

2

Tout ce que vous devriez avoir à faire est de modifier l'instruction WHERE dans la requête:

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 

Le nouveau où la déclaration a deux conditions, donc plutôt que d'interroger le même ensemble de tables/jointures deux fois , nous demandons juste une fois et vérifions les deux conditions!

+0

Merci! Mais j'ai reçu ce message: # 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près des résultats ' AS (SELECT 'e'. *,' f'.'titulo' AS 'feedTitulo',' f'.'url'' à la ligne 1 –

+0

@Keyne - avez-vous le point-virgule au début ?, et permettez-moi de changer les noms des variables dans l'instruction de sélection finale, ils sont faux – Brett

+0

Oui, je l'ai vu http://stackoverflow.com/questions/1382573/how-do-use-the-with-clause-in-mysql On dirait que Mysql ne supporte pas cela. –

Questions connexes