2010-11-15 2 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.

Я думаю, что это одна из тех действительно простых вещей, которые я как-то упустил из-за усталости или чего-то еще.

Либо это, либо я в буквальном смысле придется сделать еще один присоединиться к каждой категории, которую я хочу включать например:

 
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, имена таблиц не должны быть в виде плюрара.

+0

Так же, как и мой пример на дне? Я просто предположил, что может быть лучшее решение, что, если, например, я хотел использовать 10 категорий, для этого потребуется 10 объединений. – robjbrain

+0

выберите * из статей, где article_id в (выберите article_id из articles_categories, где category_id в (3, 5, 7, 9, 11)) – Jarek

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; 
Смежные вопросы