2010-11-11 4 views
6

Disons que j'ai une table d'articles avec autant de relations avec beaucoup de sujets. Chaque rubrique affectée à un article a un champ type qui peut contenir 1 des 3 valeurs AND, NOT et OR.requête mysql avec AND, OR et NOT

Articles 
    id 
    .... 

Topics 
    id 
    .... 

ArticleTopics 
    article_id 
    topic_id 
    type 

Je veux créer une requête qui dit retourne tous les articles qui ont:

ALL of the following topics: 1, 2, 3 (AND association) 
    AND 
ANY of the following topics: 4, 5, 6 (OR association) 
    AND 
NONE of the following topics 7, 8 (NOT association) 

Comment puis-je sur la création de cette requête?

Merci d'avance!

+0

Travail à domicile? ...;) – Select0r

+0

Non pour le travail, je n'ai pas fait de devoirs depuis environ 12 ans! – Lizard

+0

Existe-t-il un index unique sur 'ArticleTopics (article_id, topic_id)'? Quelle est la signification exacte de la colonne 'type'? Pourquoi avoir un type 'NOT', plutôt que de ne pas avoir d'entrée dans la table 'ArticleTopics'? – outis

Répondre

1

Les tous et non des pièces sont très simples, vous les enchaînez juste avec ANDs:

SELECT X Y DE a et b et c ET NON ET D e ET NON e.

Et les salles d'opération vont entre:

SELECT X DE Y OU ((a et b et c) et (d ou e ou f)) ET NON g et h

remplacer un petit nombre avec comparaisons et vous avez terminé. Donc, si vous voulez faire cela dans le code, triez vos conditions et ensuite les chaîner ensemble comme une chaîne. Veillez à éviter les insertions SQL.

+3

Les champs sont sur une relation, donc ce n'est pas aussi simple que cela. –

0

Si je reçois cela correctement

SELECT * FROM ArticleTopics where type = 'AND' 
UNION 
    SELECT * FROM ArticleTopics where type = 'OR' limit 1 

Je suppose que par « tout » que vous voulez dire « une ». Vous pouvez vous-même joindre les articles aux sujets, c'est trivial.

0
SELECT a.id, a.name 
    FROM Articles a, ArticleTopics arto 
    WHERE arto.article_id = a.id 
    AND 
     ((arto.topic_id = 1 AND arto.type like 'AND') AND (arto.topic_id = 2 AND arto.type like 'AND') AND (arto.topic_id = 3 AND arto.type like 'AND')) 
    AND 
     ((arto.topic_id = 4 AND arto.type like 'OR') AND (arto.topic_id = 5 AND arto.type like 'OR') AND (arto.topic_id = 6 AND arto.type like 'OR')) 
    AND 
     ((arto.topic_id = 7 AND arto.type like 'NOT') AND (arto.topic_id = 8 AND arto.type like 'NOT')) 
+0

Notez que vous pouvez mettre en forme des lignes en code en les indentant quatre espaces. Le bouton "101 \ n010" dans la barre d'outils de l'éditeur le fait pour vous. Cliquez sur le point d'interrogation orange dans la barre d'outils de l'éditeur pour plus d'informations et des conseils sur le formatage. – outis