2010-11-15 11 views
0

J'aimerais pouvoir obtenir des lignes d'une table "articles" basée sur deux "catégories" mais j'ai des problèmes avec mes jointures. Voici ce que mes tables ressemblerait à ceci:MySQL Joindre sur deux lignes

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

Maintenant, ce que je voudrais être en mesure de faire est d'obtenir tous les articles qui sont dans les deux catégories 3 et 5 (ou un nombre illimité de catégories). Je pensais que je pouvais faire quelque chose comme ceci:

 
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) 

Juste pour que je ne veux pas préciser les articles qui sont en 3 ou 5, mais les deux 3 et 5.

Je pense que cela est une de ces choses vraiment simples que j'ai ratées en raison de la fatigue ou de quelque chose.

Soit ça ou je vais devoir littéralement faire une autre pour rejoindre toutes les catégories que je veux inclure par exemple:

 
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) 

Mais je suis sûr qu'il ya une solution plus simple que cela.

Répondre

1

essayer

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) requête suivante devrait fonctionner (je ne l'ai pas tester)

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) Votre modèle de données est erroné. Vous devez avoir 3 tables: aticle, category et aticle_to_category, les noms de tables ne doivent pas être sous forme plurielle.

+0

donc la même chose que mon exemple au fond? J'ai juste supposé qu'il pourrait y avoir une meilleure solution, et si, par exemple, je souhaitais utiliser 10 catégories, cela nécessiterait 10 jointures. – robjbrain

+0

sélectionner * à partir d'articles où article_id dans (select article_id from article_categories où category_id dans (3, 5, 7, 9, 11)) – Jarek

0

Une autre alternative serait la suivante:

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;