2010-08-30 75 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