2010-11-11 11 views
6

Digamos que tengo una tabla de artículos con una relación de muchos a muchos con los temas. Cada tema asignado a un artículo tiene un campo type que puede contener 1 de 3 valores AND, NOT y OR.consulta de mysql con Y, O y NO

Articles 
    id 
    .... 

Topics 
    id 
    .... 

ArticleTopics 
    article_id 
    topic_id 
    type 

Quiero crear una consulta que devuelve todos los artículos dice que tienen:

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) 

¿Cómo hago para crear esta consulta?

¡Gracias de antemano!

+0

¿Deberes? ...;) – Select0r

+0

¡No es para el trabajo, no he hecho la tarea en aproximadamente 12 años! – Lizard

+0

¿Hay un índice único en 'ArticleTopics (article_id, topic_id)'? ¿Cuál es el significado exacto detrás de la columna 'tipo'? ¿Por qué tener un tipo 'NOT', en lugar de simplemente no tener una entrada en la tabla 'ArticleTopics'? – outis

Respuesta

1

Las partes todos y no son muy simples, sólo les cadena con AND:

SELECT x de y donde A y B y C y D y E NO Y NO e.

Y las RUP van entre:

SELECT X de Y DONDE ((A y B y C) y (D o E o F)) y no g Y NO h

reemplazan pequeños números con comparaciones y listo. Así que si quieres hacer esto en el código, ordena tus condiciones y luego simplemente encadenalas como una cadena. Tenga cuidado de evitar las Inserciones SQL.

+3

Los campos están sobre una relación, por lo que no es tan simple como esto. –

0

Si consigo esto correctamente

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

supongo por 'cualquier' quiere decir 'cualquiera'. Puede unir los artículos a temas usted mismo, eso es 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

Tenga en cuenta que puede formatear líneas como código al sangrarlas cuatro espacios. El botón "101 \ n010" en la barra de herramientas del editor lo hace por usted. Haga clic en el signo de interrogación naranja en la barra de herramientas del editor para obtener más información y sugerencias sobre el formateo. – outis