2010-11-15 73 views
0

我希望能夠根據兩個「類別」從「文章」表中獲取行,但是我遇到了連接問題。這裏是我的表會是什麼樣子:MySQL加入兩行

 
`articles` (
    `article_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, 
    `article_name` varchar(255) NOT NULL 
    PRIMARY KEY (`article_id`) 
) 
 
`article_categories` (
    `article_id` smallint(5) unsigned NOT NULL, 
    `category_id` smallint(5) unsigned NOT NULL 
    UNIQUE KEY `article_category_id` (`article_id`,`category_id`), 
    KEY `article_id` (`article_id`), 
    KEY `category_id` (`category_id`) 
) 

現在我希望能夠做的就是讓它們在兩個類別3和5(或類別的數量不受限制)的所有文章。我想我可以做這樣的事情:

 
SELECT * FROM articles a INNER JOIN article_categories ac ON ac.article_id = a.article_id WHERE (ac.category_id = 3 AND ac.category_id = 5) 

只是爲了澄清,我不希望出現這種情況是在3或5篇文章,但兩者3和5

我在想,這是其中一件非常簡單的事情,我由於疲倦或某事而錯過了某些東西。

如果不是這樣,我會從字面上做另外加入的,我想包括e.g每個類別:

 
SELECT a.* FROM articles a INNER JOIN article_categories ac ON ac.article_id = a.article_id INNER JOIN article_categories ac2 ON ac2.article_id = a.article_id WHERE (ac2.category_id = 3 AND ac.category_id = 5) 

但我敢肯定有一個簡單的解決方案,這一點。

回答

1

嘗試

select 
    articles.article_id 
from 
    articles, 
    article_categories 
where 
    articles.article_id=article_categories.article_id and 
    article_categories.category_id in(3,5) 
group by 
    article_categories.article_id 
having count(*)>=2; 
0

1)下面的查詢應該工作(我還沒有測試它)

select art.* 
from 
    articles art 
    inner join cat1 on cat1.article_id = art.article_id 
    inner join cat2 on cat2.article_id = art.article_id 
where 
    cat1.category_id = 3 
    and cat2.category_id = 5 

2)你的數據模型是錯誤的。你應該有3個表:aticle,category和aticle_to_category, 表名不應該是plurar形式。

+0

所以同我在底部的例子嗎?我只是假設可能有更好的解決方案,例如,如果我希望使用10個類別,則需要10個連接。 – robjbrain 2010-11-15 12:20:00

+0

從article_id中選擇* from(article_id from article_categories where category_id in(3,5,7,9,11)) – Jarek 2010-11-15 12:28:51

0

另一種方法是:

SELECT article_id FROM (SELECT article_id, count(*) AS cat FROM article_categories WHERE category_id IN (3,5,7)) arts WHERE arts.cat = 3;