2010-08-30 76 views
0

我有这四个表格如下所述。基本上我有饲料与条目有关的类别,每个类别可以是一个主要类别与否(标志命名为“委托人”)。 另外每个提要可以是合作伙伴提要或不提供(标记为“parceiro”)。这是执行此查询的最佳方法吗?也许UNION

我想选择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 

我需要与日期ordened限制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) 
) 

回答

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行 – 2010-08-30 20:24:55

+0

@Keyne - 你在开始时是否有分号?并让我在最终的select语句中更改变量名,它们是错误的 – Brett 2010-08-30 20:32:57

+0

是的,我有。请参阅http://stackoverflow.com/questions/1382573/how-do-you-use-the-clause-in-mysql看起来像Mysql不支持这一点。 – 2010-08-30 20:38:22