2012-02-12 6 views
6

Consulta de mensajes wordpress según sus etiquetas pueden tener este aspecto (si monté juntos correctamente - He quitado partes irrelevantes de la consulta):mensajes de filtro en una consulta si sólo tienen una cierta etiqueta

SELECT wposts.ID AS ID, 
wposts.post_title, wposts.post_status, wposts.post_name, 
tag_terms.term_id AS tag_id 

FROM `wp_posts` AS wposts 

INNER JOIN wp_term_relationships AS tag_term_relationships ON (wposts.ID = tag_term_relationships.object_id) 
INNER JOIN wp_term_taxonomy AS tag_term_taxonomy ON (tag_term_relationships.term_taxonomy_id = tag_term_taxonomy.term_taxonomy_id AND tag_term_taxonomy.taxonomy = 'post_tag') 
INNER JOIN wp_terms AS tag_terms ON (tag_term_taxonomy.term_id = tag_terms.term_id) 

WHERE wposts.ID = '12345' 

AND wposts.post_type = 'post' 

AND wposts.post_status NOT LIKE 'private' 

AND tag_terms.term_id = '55' 

GROUP BY wposts.ID 
ORDER BY wposts.post_date ASC 

Esto debería consultar todas las publicaciones con id. De etiqueta 55.

Lo que debo hacer es filtrar todas las publicaciones que solo contengan esta etiqueta, pero no otras etiquetas.

Así que quiero mostrar una publicación si tiene las etiquetas 23,34,55,67 Pero no quiero mostrar la publicación si tiene la etiqueta 55 (y ninguna otra etiqueta). Las publicaciones que no contienen esta cierta etiqueta también se deben incluir en la consulta.

¿Cómo puedo hacer esto?

+1

haciendo las cosas mal. siempre debe seleccionar publicaciones con la clase WP_query: http://codex.wordpress.org/Class_Reference/WP_Query – janw

+1

Estoy de acuerdo con @janw, a menos que esté desarrollando su propio complemento, no debería necesitar escribir una declaración SELECT, nunca . – twilson

+1

tonterías. Necesito consultar varios metavalores, miniaturas, el nombre de usuario y las etiquetas, todo en la misma consulta. WP_Query es para dummies y no permite la flexibilidad que necesito. – reggie

Respuesta

4

Trate de añadir HAVING condición entre GROUP BY y ORDER BY:

... 
GROUP BY wposts.ID 
HAVING COUNT(tag_terms.term_id) <> 1 
    OR MAX(tag_terms.term_id) <> 55 
ORDER BY wposts.post_date ASC 

y cambiar su condición WHERE para comprobar solamente para el tipo de correos y de estado.

Además, si no selecciona nada más que tag_id de wp_terms, no es necesario, ya que puede usar term_id de wp_term_taxonomy.

+0

Gracias. Nunca había oído hablar de la cláusula HAVING. – reggie

+0

uh ?? ¿Cómo puede funcionar esta, seleccionando 'tag_terms.term_id' y usándolo en una cláusula al mismo tiempo? ¿Me falta algo? – Aprillion

+0

No hay selección aquí, no sabemos qué OP quiere seleccionar, si él quería las etiquetas, probablemente usaría GROUP_CONCAT en los nombres, o unir términos nuevamente después de filtrar las publicaciones innecesarias. La consulta en la pregunta es completamente diferente, con un propósito diferente. – piotrm

1

Si quiere todas las publicaciones con una determinada etiqueta, ¿por qué ha especificado la ID de la publicación en la consulta?

Esta consulta siguiente mostrará todos los mensajes con el ID de etiqueta dada

SELECT wposts.ID AS ID, 
wposts.post_title, wposts.post_status, wposts.post_name, 
tag_terms.term_id AS tag_id 

FROM `wp_posts` AS wposts 

INNER JOIN wp_term_relationships AS tag_term_relationships ON (wposts.ID = tag_term_relationships.object_id) 
INNER JOIN wp_term_taxonomy AS tag_term_taxonomy ON (tag_term_relationships.term_taxonomy_id = tag_term_taxonomy.term_taxonomy_id AND tag_term_taxonomy.taxonomy = 'post_tag') 
INNER JOIN wp_terms AS tag_terms ON (tag_term_taxonomy.term_id = tag_terms.term_id) 


WHERE wposts.post_type = 'post' 

AND wposts.post_status NOT LIKE 'private' 

AND tag_terms.term_id = '55' 

GROUP BY wposts.ID 
ORDER BY wposts.post_date ASC 

Ahora, si usted quiere asegurarse de que estos mensajes tienen sólo el ID de etiqueta dado, nido de la consulta de la siguiente manera:

SELECT wposts.ID AS ID, 
    wposts.post_title, wposts.post_status, wposts.post_name, 
    tag_terms.term_id AS tag_id 

    FROM `wp_posts` AS wposts 

    INNER JOIN wp_term_relationships AS tag_term_relationships ON (wposts.ID = tag_term_relationships.object_id) 
    INNER JOIN wp_term_taxonomy AS tag_term_taxonomy ON (tag_term_relationships.term_taxonomy_id = tag_term_taxonomy.term_taxonomy_id AND tag_term_taxonomy.taxonomy = 'post_tag') 
    INNER JOIN wp_terms AS tag_terms ON (tag_term_taxonomy.term_id = tag_terms.term_id) 


    WHERE wposts.post_type = 'post' 

    AND wposts.post_status NOT LIKE 'private' 

    AND tag_terms.term_id = '55' 

    GROUP BY wposts.ID 
    HAVING COUNT(tag_terms.term_id) <> 1 
    OR MAX(tag_terms.term_id) <> 55  
    ORDER BY wposts.post_date ASC 
Cuestiones relacionadas