texto separar sentencias resueltos por ejercicios ejemplos delimitada consultas complejas comas columnas cadena avanzadas sql mysql ruby-on-rails tags tagging

sentencias - separar cadena delimitada por comas en sql server



Necesita ayuda con la consulta sql para encontrar elementos etiquetados con todas las etiquetas especificadas (2)

Usando IN:

SELECT p.* FROM POSTS p WHERE p.id IN (SELECT tg.post_id FROM TAGGINGS tg JOIN TAGS t ON t.id = tg.tag_id WHERE t.name IN (''Cheese'',''Wine'',''Paris'',''Frace'',''City'',''Scenic'',''Art'') GROUP BY tg.post_id HAVING COUNT(DISTINCT t.name) = 7)

Usando un JOIN

SELECT p.* FROM POSTS p JOIN (SELECT tg.post_id FROM TAGGINGS tg JOIN TAGS t ON t.id = tg.tag_id WHERE t.name IN (''Cheese'',''Wine'',''Paris'',''Frace'',''City'',''Scenic'',''Art'') GROUP BY tg.post_id HAVING COUNT(DISTINCT t.name) = 7) x ON x.post_id = p.id

Usando EXISTS

SELECT p.* FROM POSTS p WHERE EXISTS (SELECT NULL FROM TAGGINGS tg JOIN TAGS t ON t.id = tg.tag_id WHERE t.name IN (''Cheese'',''Wine'',''Paris'',''Frace'',''City'',''Scenic'',''Art'') AND tg.post_id = p.id GROUP BY tg.post_id HAVING COUNT(DISTINCT t.name) = 7)

Explicación

El quid de la COUNT(DISTINCT t.name) es que el COUNT(DISTINCT t.name) necesita coincidir con el número de nombres de las etiquetas para garantizar que todas esas etiquetas estén relacionadas con la publicación. Sin el DISTINCT, existe el riesgo de que los duplicados de uno de los nombres devuelvan un recuento de 7, por lo que tendría un falso positivo.

Actuación

La mayoría le dirá que el JOIN es óptimo, pero JOIN también corre el riesgo de duplicar filas en el conjunto de resultados. EXISTS sería mi próxima opción: no hay riesgo duplicado y, en general, una ejecución más rápida, pero consultar el plan de explicación en última instancia te dirá qué es lo mejor según tu configuración y tus datos.

Digamos que tengo las siguientes tablas:

TAGS

id: entero
nombre: cadena

POSTS

id: entero
cuerpo de texto

ETIQUETAS

id: entero
tag_id: entero
post_id: entero

¿Cómo voy a escribir una consulta que seleccione todas las publicaciones etiquetadas con TODAS las siguientes etiquetas (nombre del atributo de la tabla de etiquetas): "Queso", "Vino", "París", "Fracción", "Ciudad", " Escénico "," Arte "

Consulte también: necesita ayuda con la consulta sql para encontrar elementos con la mayoría de las etiquetas especificadas (nota: ¡similar, pero no duplicada!)


Prueba esto:

Select * From Posts p Where Not Exists (Select * From tags t Where name in (''Cheese'', ''Wine'', ''Paris'', ''Frace'', ''City'', ''Scenic'', ''Art'') And Not Exists (Select * From taggings Where tag_id = t.Tag_Id And post_Id = p.Post_Id))

Explicación : Pedir una lista de las Publicaciones que han tenido asociado un conjunto de etiquetas específico es equivalente a solicitar aquellas publicaciones en las que no hay ninguna etiqueta en el mismo conjunto especificado, que no se haya asociado con ella. es decir, el sql anterior.