Estoy tratando de filtrar las categorías asignadas a los temas según las categorías asignadas a cada tema. Tengo tres tablas, una tabla de temas (id, nombre), una tabla de categorías (id, nombre) y una tabla que une las dos tablas en una relación de uno a muchos (id, topic_id, category_id).

Por ejemplo, tengo una lista de atracciones y espectáculos en parques temáticos populares (Space Mountain, Thunder Mountain, It's a Small World, The Haunted Mansion, Tower Of Terror, Test Track, etc.), una lista de categorías (Magic Kingdom, Epcot, Animal Kingdom, Thrill Rides, Shows, Family Rides, Boat Rides, etc.) y una tabla intermedia que los une ((1,1,3), (1,1,5), (1,2,5) , etc.).

Ejemplo de SQLFiddle

Tengo la consulta básica construida para la entrada de una sola categoría, pero no puedo averiguar cómo filtrar usando múltiples categorías. Por ejemplo, si consulto las categorías 'reino mágico' Y 'espectáculos nocturnos', se filtrarían categorías como 'epcot' y 'atracciones emocionantes'.

Mi consulta es la siguiente:

SELECT DISTINCT scat.name FROM category AS cat 
JOIN bridge ON cat.id = bridge.cat_id 
JOIN topic ON bridge.top_id = topic.id 
JOIN bridge AS sbridge ON topic.id = sbridge.top_id 
JOIN category AS scat ON sbridge.cat_id = scat.id 
WHERE cat.slug = 'hollywood-studios' 
ORDER BY scat.name ASC

¡Gracias por la ayuda por adelantado!

2
Efrain Anthony Negron 16 feb. 2018 a las 22:48

2 respuestas

La mejor respuesta

Hasta donde tengo entendido, necesita categorías que coincidan con temas que coincidan con TODAS las categorías de filtro.
Simplemente tiene que completar la lista de categorías coincidentes y codificar su recuento. Ahora es 2

SELECT DISTINCT
  cat.name
FROM bridge b
JOIN category cat
  ON b.cat_id = cat.id
WHERE b.top_id IN (
  SELECT
    b.top_id
  FROM bridge b
  JOIN category c
    ON c.id = b.cat_id
  WHERE c.slug IN ('magic-kingdom', 'nighttime-shows')
  GROUP BY b.top_id
  HAVING count(b.cat_id) = 2
)
1
AlexanderMP 16 feb. 2018 a las 20:27

Use OR en la cláusula where para filtrar registros de múltiples categorías como

SELECT DISTINCT scat.name FROM category AS cat 
JOIN bridge ON cat.id = bridge.cat_id 
JOIN topic ON bridge.top_id = topic.id 
JOIN bridge AS sbridge ON topic.id = sbridge.top_id 
JOIN category AS scat ON sbridge.cat_id = scat.id 
WHERE cat.slug = 'hollywood-studios' OR cat.slug = 'fireworks-shows'  
ORDER BY scat.name ASC
0
NIMI 16 feb. 2018 a las 20:08