2010-11-11 12 views
6

Diciamo che ho una tabella di articoli con un numero di argomenti che varia da molti a molti. Ogni argomento assegnato a un articolo ha un campo type che può contenere 1 di 3 valori AND, NOT e OR.query mysql con AND, OR e NOT

Articles 
    id 
    .... 

Topics 
    id 
    .... 

ArticleTopics 
    article_id 
    topic_id 
    type 

Voglio creare una query che dice restituisce tutti gli articoli che hanno:

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) 

Come faccio a creare questa ricerca?

Grazie in anticipo!

+0

Compiti? ...;) – Select0r

+0

No per lavoro, non ho fatto i compiti in circa 12 anni! – Lizard

+0

Esiste un indice univoco su 'ArticleTopics (article_id, topic_id)'? Qual è il significato esatto dietro la colonna 'type'? Perché avere un tipo 'NOT', piuttosto che semplicemente non avere una voce nella tabella 'ArticleTopics'? – outis

risposta

1

I tutti e non le parti sono molto semplici, basta li catena con AND:

SELEZIONA X da Y dove A e B e C e D e E NON E NON e.

E le RUP vanno tra:

SELEZIONA X da Y WHERE ((A e B e C) e (D o E o F)) E NON g E NON h

sostituire piccoli numeri con confronti e il gioco è fatto. Quindi, se vuoi farlo in codice, ordina le tue condizioni e poi uniscile insieme come una stringa. Fai attenzione a evitare le inserzioni SQL.

+3

I campi hanno una relazione, quindi non è così semplice. –

0

Se ottengo questo correttamente

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

presumo da 'qualsiasi' 'uno' vuoi dire. Puoi unirti agli articoli per te stesso, è banale.

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

Nota è possibile formattare le righe come codice indentandole di quattro spazi. Il pulsante "101 \ n010" nella barra degli strumenti dell'editor fa questo per te. Fare clic sul punto interrogativo arancione nella barra degli strumenti dell'editor per ulteriori informazioni e suggerimenti sulla formattazione. – outis