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

Me cuenta cualquier cosa

Estas en el tema de Me cuenta cualquier cosa en el foro de Mysql en Foros del Web. Buenas Necesito mostrar cuantos temas tiene una categoria, hago la siguiente consulta: Código PHP:                 SELECT DISTINCT og . nid  AS  cat_id ,  MAX ( node . nid ...
  #1 (permalink)  
Antiguo 13/01/2010, 11:58
 
Fecha de Ingreso: agosto-2003
Mensajes: 906
Antigüedad: 20 años, 8 meses
Puntos: 3
Me cuenta cualquier cosa

Buenas

Necesito mostrar cuantos temas tiene una categoria, hago la siguiente consulta:

Código PHP:
                SELECT DISTINCT og.nid AS cat_idMAX(node.nid) AS art_idcount(node.nid) as cantidad
        FROM og
        LEFT JOIN og_ancestry ON og_ancestry
.group_nid og.nid
        LEFT JOIN node ON node
.nid og_ancestry.nid
        LEFT JOIN users ON users
.uid node.uid
        LEFT JOIN term_node tn on tn
.nid=og.nid
        join node node2 on node2
.nid=og.nid
        WHERE node
.type 'articulo' and node.status=and tn.tid=and node2.type='articulos'
        
GROUP BY type
        ORDER BY art_id desc 
Pero me devuelve por ejemplo que hay 25 articulos cuando en realidad hay 10 en una y asi con cualquiera me muestra cualquier numero.
  #2 (permalink)  
Antiguo 14/01/2010, 05:38
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Me cuenta cualquier cosa

Sin acabar de entender tu estructura de tablas voy a intentar analizar los que estas haciendo...

Código MySQL:
Ver original
  1. SELECT DISTINCT og.nid AS cat_id,
  2.                              MAX(node.nid) AS art_id,
  3.                              count(node.nid) as cantidad
  4.         FROM og
  5.                LEFT JOIN og_ancestry
  6.                          ON og_ancestry.group_nid = og.nid
  7.                LEFT JOIN node
  8.                          ON node.nid = og_ancestry.nid
  9.                LEFT JOIN users
  10.                          ON users.uid = node.uid
  11.                LEFT JOIN term_node tn
  12.                          ON tn.nid=og.nid
  13.                join node node2
  14.                          on node2.nid=og.nid
  15.         WHERE node.type = 'articulo'
  16.               and node.status=1
  17.               and tn.tid=1
  18.               and node2.type='articulos'
  19.         GROUP BY type
  20.         ORDER BY art_id desc ;

Si haces cualquier consulta es facil que te conteste cualquier cosa....

Código MySQL:
Ver original 

En una consulta agregada (group by) no suele ser necesario...

Código MySQL:
Ver original
  1. LEFT JOIN users
  2.                          ON users.uid = node.uid

Los usuarios parece que no los necesitas....no???

Código MySQL:
Ver original 

Código MySQL:
Ver original
  1. GROUP BY og.nid

Si quieres saber el numero de articulos por categoria deberas agrupar por categorias (og.nid AS cat_id) ... no?


Código MySQL:
Ver original
  1. LEFT JOIN node
  2.                          ON node.nid = og_ancestry.nid
  3.                ...
  4.                join node node2
  5.                          on node2.nid=og.nid
  6.                ...
  7.        WHERE node.type = 'articulo'
  8.         ...
  9.               and node2.type='articulos'

simplificando

Código MySQL:
Ver original
  1. LEFT JOIN node
  2.                          ON node.nid = og_ancestry.nid
  3.        ...
  4.        WHERE (node.type = 'articulo' or node.type='articulos')
  5.                and ...


Código MySQL:
Ver original
  1. ORDER BY art_id desc ;

creo que no puedes usar el alias aqui

Código MySQL:
Ver original
  1. ORDER BY MAX(node.nid) desc ;




Código MySQL:
Ver original
  1. SELECT og.nid AS cat_id,
  2.                              MAX(node.nid) AS art_id,
  3.                              count(node.nid) as cantidad
  4.         FROM (((og
  5.                LEFT JOIN og_ancestry
  6.                          ON og_ancestry.group_nid = og.nid)
  7.                LEFT JOIN node
  8.                          ON node.nid = og.nid)
  9.                LEFT JOIN term_node tn
  10.                          ON tn.nid=og.nid)
  11.         WHERE (node.type = 'articulo' or node.type='articulos')
  12.               and node.status=1
  13.               and tn.tid=1
  14.         GROUP BY og.nid
  15.         ORDER BY MAX(node.nid) desc ;

Suerte

Quim

1001
  #3 (permalink)  
Antiguo 14/01/2010, 06:30
 
Fecha de Ingreso: agosto-2003
Mensajes: 906
Antigüedad: 20 años, 8 meses
Puntos: 3
Respuesta: Me cuenta cualquier cosa

Buenisima la explicacion, te agradezco, lo unico que la forma que me mostras no funciona ni muestra contenido, a los usuarios los igualo porque muestro los contenido de cada usuario, es decir, por eso los necesito igualar, por ejemplo debo decir:

Sender
12 Envios en articulos

Claudio
15 envios en articulos

y asi...es lo que deseo mostrar...no encuentro bien el problema...tn.nid = 1 es la categoria articulos...node.type tambien entonces los igualo...tn son taxotomi...uso drupal...
  #4 (permalink)  
Antiguo 14/01/2010, 07:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Me cuenta cualquier cosa

- Tanto en el ORDER BY y en el GROUP BY, se pueden usar los alias definidos en el SELECT. En tu caso eso puede ser la razón por la que no está devolviendo datos.
- Los paréntesis en el FROM pueden resultar redundantes, porque esa segmentación es el que usa realmente MySQL, por lo cual ponerlos o no ponerlos es irrelevante. Debería funcionar de cualquier forma.
- Igualar los usuarios para mostrar el contenido de artículos en una sentencia con agrupamiento es fútil, porque te mostrará solamente el contenido del primer registro de ese usuario y no todos. Si esa es tu intención, bien, sino, se puede eliminar.
- Para definir mejor las relaciones entre las tablas nos depberías dar la estructura y dependencias de las mismas, sino, estamos trabajando algo en el aire, porque a simple vista no se entiende bien la relación entre los usuarios y el resto.
- El orden de las tablas parece no estar bien. Si lo que quieres es un listado de los artículos enviados por los usuarios, la tabla usuarios debería ser la primera, y el resto según la dependencia de datos, usando LEFT JOIN y no INNER JOIN.

Simplificando un poco lo propuesto por quimfv, andaría por acá:
Código MySQL:
Ver original
  1.   og.nid cat_id,
  2.   MAX(node.nid) art_id,
  3.   count(node.nid) cantidad
  4.   og
  5.   LEFT JOIN og_ancestry ON og_ancestry.group_nid = og.nid
  6.   LEFT JOIN node ON node.nid = og.nid
  7.   LEFT JOIN term_node tn ON tn.nid=og.nid
  8.   (node.type = 'articulo' OR node.type='articulos')
  9.   AND node.status=1
  10.   AND tn.tid=1
  11. GROUP BY og.nid
  12. ORDER BY art_id DESC;

Pero, insisto, para hacerlo bien necesitaríamos saber cómo es la dependencia de las tablas entre si.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 14/01/2010, 07:32
 
Fecha de Ingreso: agosto-2003
Mensajes: 906
Antigüedad: 20 años, 8 meses
Puntos: 3
Respuesta: Me cuenta cualquier cosa

Las tablas dependen entre si como estan armadas al principio cuando las mostre, es decir, los left join estan bien, creo porque cuando intento contar los que no son de categoria 1, por ejemplo si hago la consulta tal cual pero en el where meto:

Código PHP:
WHERE node.type 'articulo' and node.status=and tn.tid not in (1) and node2.type='articulo' 
me muestra bien, noten el not in 1, esto lo hago cuando deseo mostrar articulos que no son de esa categoria....pero lo que necesito es mostrar ahora de la categoria 1! solamente......las dependencias son tal cual los left join...puede que este mal el group by...o por ahi el tema...
  #6 (permalink)  
Antiguo 14/01/2010, 08:01
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Me cuenta cualquier cosa

Las dependencias definidas en tu consulta no me resultan suficientemente claras. Tal y como las pones puede haber información que no esté saliendo debido a la posición de las tablas en el FROM.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 14/01/2010, 08:16
 
Fecha de Ingreso: agosto-2003
Mensajes: 906
Antigüedad: 20 años, 8 meses
Puntos: 3
Respuesta: Me cuenta cualquier cosa

La consulta y los join estan bien porque me muestra los titulos y datos de la nota como deben ser...es posible meter en el count una subconsulta?, por ahi puede venir la mano...
  #8 (permalink)  
Antiguo 14/01/2010, 08:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Me cuenta cualquier cosa

Prueba tu misma consulta con unos cambios y dime qué resultado te da:
Código MySQL:
Ver original
  1.   og.nid cat_id,
  2.   MAX(node.nid) art_id,
  3.   COUNT(node.nid)
  4.   cantidad
  5. FROM og
  6.   LEFT JOIN og_ancestry ON og_ancestry.group_nid = og.nid
  7.   LEFT JOIN node ON node.nid = og_ancestry.nid
  8.   LEFT JOIN users ON users.uid = node.uid
  9.   LEFT JOIN term_node tn ON tn.nid=og.nid
  10.   INNER JOIN node node2 ON node2.nid=og.nid
  11.   node.`type` = 'articulo'
  12.   AND node.`status`=1
  13.   AND tn.tid=1
  14.   AND node2.`type`='articulos'
  15. GROUP BY `type`
  16. ORDER BY art_id DESC;

Nota: No uses palabras reservadas (como es el caso de type y status) en los nombres de bases, tablas y campos, los resultados pueden ser erráticos.

Nota 2: La consulta tal y como la has planteado no te devolverá ciertos datos si un user no aparece en nodo. Supongo que lo habrás considerado...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: Ninguno
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 04:30.