Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Filtrar resultados que están en varias categorías

Estas en el tema de Filtrar resultados que están en varias categorías en el foro de Mysql en Foros del Web. Hola gente. Tengo un problemita y quizás un alma caritativa me ayude con esto. Existe una tabla 'articulos', otra 'categorias' y otra llamada 'relacion' que ...
  #1 (permalink)  
Antiguo 04/02/2009, 15:51
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Filtrar resultados que están en varias categorías

Hola gente. Tengo un problemita y quizás un alma caritativa me ayude con esto.

Existe una tabla 'articulos', otra 'categorias' y otra llamada 'relacion' que empareja los artículos con sus categorías. Por otra parte cada artículo pertenece a varias categorías simultáneamente ( Por ejemplo, el artículo "Pastor Alemán" pertenece a las categorías "Mascotas", "Caninos", "Perros grandes", etc.)

¿Cómo podría decirle a MySQL que me traiga todos los artículos que pertenezcan a las categorías '32' y '17', es decir, no quiero que me devuelva todos los de la '32' y todos los de la '17' sino sólo los que pertenezcan a la 32 y 17 al mismo tiempo. Llevo 2 días averiguándolo y nada.
  #2 (permalink)  
Antiguo 04/02/2009, 16:55
 
Fecha de Ingreso: agosto-2008
Mensajes: 173
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Filtrar resultados que están en varias categorías

mmm hola no se si te entendí bien.. pero ahi va mi idea..

puedes recorrer tu lista de articulos con do-while...
y vas buscando cada articulo en tu tabla de relacion... si aparece 2 o mas veces ... las insertas en una tabla extra... ya que quiere decir que pertenece a varias categorias al mismo tiempo no?...

no se que campos tengas en las tablas pero ahi va:

$query_Recordset1 = "select campo_articulo from articulos";
$Recordset1 = mysql_query($query_Recordset1, $conex) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);

do{

$query_Recordset = "select articulo,categoria from relacion where articulo='".$row_Recordset1['campo_articulo'] ."' ";
$Recordset = mysql_query($query_Recordset, $conex) or die(mysql_error());
$row_Recordset = mysql_fetch_assoc($Recordset);
$totalRows_Recordset = mysql_num_rows($Recordset);

if($totalRows_Recordset>2){

do{

$query_Recordsetinsert = "insert into tabla_coincidencias (campo1, campo2) values ('".$row_Recordset['articulo']."', '".$row_Recordset['categoria']."')";
$Recordsetinsert = mysql_query($query_Recordsetinsert, $conex) or die(mysql_error());

}while($row_Recordset = mysql_fetch_assoc($Recordset));

} //if


}while($row_Recordset1 = mysql_fetch_assoc($Recordset1));
  #3 (permalink)  
Antiguo 05/02/2009, 02:17
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Filtrar resultados que están en varias categorías

metacortex,

Código sql:
Ver original
  1. SELECT a.articulos, c.categoria FROM articulos a INNER JOIN relacion r ON a.articulos_id = r.articulos_refid
  2. INNER JOIN categorias c ON c.categorias_id = r.categorias_refid
  3. WHERE r.categorias_refid = 32 OR r.categorias_refid = 17
  4. GROUP BY a.articulos_id
  5. HAVING COUNT(DISTINCT r.categorias_refid) > 1
Te explicaré algo la consulta (he inventado nombres para los campos que me faltan, concretamente los que relacionan las tablas; adapta la sintaxis a los nombres de tus campos):
El problema (que no es tal problema, pues la estructura está bien) es que en cada registro de relación incluye sólo un categorias_refid, y tú quieres encontrar los dos, algo que nunca encontrarás en un registro. Te toca agrupar por artículos y buscar uno u otro numero y luego ver un count superior a uno. El único peligro es que tuvieras repetido alguno de ellos, es decir, dos del mismo artículo que tuvieran el mismo categorias_refid; de ahí la necesidad de poner distinct, aunque eso es algo que podrías controlar con programación. En cualquier caso, esta es la idea. Si no te funciona, pon los nombres de los campos de las tablas e dinos por cuáles estan relacionadas y te ofreceremos la sintaxis. No la he probado.

Última edición por jurena; 05/02/2009 a las 02:24
  #4 (permalink)  
Antiguo 05/02/2009, 10:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Filtrar resultados que están en varias categorías

@susan_ por favor lee esto: http://www.forosdelweb.com/f21/funci...-datos-413499/
  #5 (permalink)  
Antiguo 06/02/2009, 00:50
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Filtrar resultados que están en varias categorías

¡Jurena eres un genio! Ciertamente hubo un pequeñísimo cambio, pero la estructura de tu ejemplo dio en el clavo... Y sin tú probarla. Mis respetos hombre. Gracias mil.

Documentando un poco el asunto, se trata de una base de datos de Wordpress. Subí la parte del SQL de artículos y categorías aquí, a fin de tener una mejor vista:

http://www.cssplain.com/varios/wp27.txt

Como se puede ver no tiene la estructura más simple, pero (dentro de mi opinión pre-amateur) algunas cosas se me han hecho muy versátiles hasta ahora.

- wp_posts controla los artículos.
- wp_terms controla las categorías
- wp_term_taxonomy controla las categorías padre e hijo
- wp_term_relationships relaciona categorías con artículos

Este es el código que finalmente me funcionó:

Código:
SELECT wp_posts.ID, wp_posts.post_title FROM wp_posts 
LEFT JOIN wp_term_relationships ON wp_posts.ID=wp_term_relationships.object_id
LEFT JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id=wp_term_taxonomy.term_taxonomy_id
LEFT JOIN wp_terms ON wp_term_taxonomy.term_id=wp_terms.term_id
WHERE wp_terms.term_id IN (32,17,36)
GROUP BY wp_posts.ID
HAVING COUNT(DISTINCT wp_terms.term_id) > 2
Para la función específica que necesitaba sólo hacía falta 2 joins, pero aproveché y me traje a wp_terms para agarrar el nombre de las categorías, lo cual también estaba pendiente. Así que sin mucho protocolo la metí en el saco.

Ayer mismo lo había logrado a fuerza de puro php, pero ahora todo lo pendiente en php es simplemente definir las variables resultantes (y las previas por supuesto). Te debo una buena caja de birras Jurena.

Susan, gracias también por tu ayuda. Muy amable.

Sorprendente saber cómo trabaja MySQL e ir conociendo formas creativas de utilizar el código.

Saludos.
  #6 (permalink)  
Antiguo 06/02/2009, 04:20
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Filtrar resultados que están en varias categorías

me alegro, metacortex.
Creo que tu solución con IN () es más eficiente que el OR... OR... y, como dices, ya sólo te falta determinar las variables para la consulta.
Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:41.