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

Un poco liado, siempre hago dos consultas en lugar de una (o peor)

Estas en el tema de Un poco liado, siempre hago dos consultas en lugar de una (o peor) en el foro de Mysql en Foros del Web. Muy buenas, Sera de chiste, porque llevo mucho tiempo sin querer aprender esto, pero hace aun mas que deberia haberlo hecho... digamos que tengo dos ...
  #1 (permalink)  
Antiguo 07/03/2010, 22:35
 
Fecha de Ingreso: febrero-2009
Mensajes: 580
Antigüedad: 15 años, 9 meses
Puntos: 13
Un poco liado, siempre hago dos consultas en lugar de una (o peor)

Muy buenas,

Sera de chiste, porque llevo mucho tiempo sin querer aprender esto, pero hace aun mas que deberia haberlo hecho...

digamos que tengo dos tablas

articulo (id, idcat, nombre, iduser...)
categoria (id, nombre, iduser,..)

Pues siempre hago,

Un select para los articulos de un usuario,
Para cada uno de ellos, hago un select en categorias para saber el nombre de la misma...


Es decir, dos consultas sabiendo la misma informacion al principio... :S (y esto aveces lo tengo en bucles xD)

Como puedo hacer eso en una sola consulta?


Gracias de antemano!
__________________
¿ya conoces la red social de cocina? descubre y comparte recetas de cocina
TONIWEB, un programador web freelance
  #2 (permalink)  
Antiguo 07/03/2010, 23:21
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 15 años, 3 meses
Puntos: 150
Respuesta: Un poco liado, siempre hago dos consultas en lugar de una (o peor)

Creo que lo que quieres es hacer un solo SELECT y te devuelva en cada fila toda la info (articulo y su categoria)

Prueba algo asi:

SELECT articulos.*,categoria.nombre as nombrecat from articulos left join categorias on articulos.idcat=categorias.id where articulos.iduser=99999

De este modo relacionas las tablas y no es necesario tener iduser en la tabla categorias como tu ya apuntabas en esa "duplicidad" de datos.

Espero que te sirva, sino, pregunta, volvere!
  #3 (permalink)  
Antiguo 08/03/2010, 11:58
 
Fecha de Ingreso: febrero-2009
Mensajes: 580
Antigüedad: 15 años, 9 meses
Puntos: 13
Respuesta: Un poco liado, siempre hago dos consultas en lugar de una (o peor)

Estoy probando con

Cita:
$sql = mysql_query("SELECT links.*,categorias.nombre AS nombrecat FROM categorias LEFT JOIN categorias ON links.idcat=categorias.id ORDER BY id DESC LIMIT $begin,$ipp");
(cambiando articulos por links)


y no me devuelve nada :S
__________________
¿ya conoces la red social de cocina? descubre y comparte recetas de cocina
TONIWEB, un programador web freelance
  #4 (permalink)  
Antiguo 08/03/2010, 12:39
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 15 años, 3 meses
Puntos: 150
Respuesta: Un poco liado, siempre hago dos consultas en lugar de una (o peor)

Pon esto tras esa linea:

Código PHP:
Ver original
  1. echo "SELECT links.*,categorias.nombre AS nombrecat FROM categorias LEFT JOIN categorias ON links.idcat=categorias.id ORDER BY id DESC LIMIT $begin,$ipp";
  2. echo "Error numero: ".mysql_errno()." Descripcion: ".mysql_error();

Asi vemos la consulta que se envia, y si hay error y su descripcion, pega aqui lo que te salga (si es que sale algo)
  #5 (permalink)  
Antiguo 08/03/2010, 12:41
 
Fecha de Ingreso: enero-2010
Ubicación: Sevilla
Mensajes: 202
Antigüedad: 14 años, 10 meses
Puntos: 5
Respuesta: Un poco liado, siempre hago dos consultas en lugar de una (o peor)

Hay un error en tu consulta, porque intentas hacer un JOIN de una tabla consigo misma:

Código MySQL:
Ver original
  1. $sql = mysql_query("SELECT links.*,categorias.nombre AS nombrecat FROM categorias LEFT JOIN categorias ON links.idcat=categorias.id ORDER BY id DESC LIMIT $begin,$ipp");

Prueba esto:

Código MySQL:
Ver original
  1. $sql = mysql_query("SELECT links.*,categorias.nombre AS nombrecat FROM categorias LEFT JOIN links ON links.idcat=categorias.id ORDER BY id DESC LIMIT $begin,$ipp");
__________________
Mi blog de temas más o menos técnicos

Y aquí el Jamón jamon de Jabugo
  #6 (permalink)  
Antiguo 09/03/2010, 16:06
 
Fecha de Ingreso: febrero-2009
Mensajes: 580
Antigüedad: 15 años, 9 meses
Puntos: 13
Respuesta: Un poco liado, siempre hago dos consultas en lugar de una (o peor)

Bueno, antes de probar la tuya, posteo como lo tengo..

algunas pruebas y tal, ahora me muestra todas las entradas de links, pero no me muestra nombre cat

consulta

Cita:
$sql = mysql_query("SELECT categorias.nombre,links.* AS nombrecat FROM categorias LEFT JOIN links ON categorias.id=links.idcat ORDER BY id DESC LIMIT $begin,$ipp");
echo "SELECT categorias.nombre,links.* AS nombrecat FROM categorias LEFT JOIN links ON categorias.id=links.idcat ORDER BY id DESC LIMIT $begin,$ipp<br>";
echo "Error numero: ".mysql_errno()." Descripcion: ".mysql_error();

Me devuelve todos los registros, pero al hacer $registro['nombrecat'], no hay nada... :S

-EDIT-

Con la ultima que me habeis posteado ocurre exactamente lo mismo....

lo podeis ver en

http://keepyourlinks.com/beta/ (lo que sigue a la @ se supone que es $nombrecat = $registro['nombrecat']; )

Aprovecho para preguntar, puedo ordenar por dos parametros? es decir que los resultados me los ordene por categorias y alfabeticamente?
__________________
¿ya conoces la red social de cocina? descubre y comparte recetas de cocina
TONIWEB, un programador web freelance

Última edición por Bam_Margera; 09/03/2010 a las 16:22
  #7 (permalink)  
Antiguo 09/03/2010, 18:32
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 15 años, 3 meses
Puntos: 150
Respuesta: Un poco liado, siempre hago dos consultas en lugar de una (o peor)

Si puedes ordenar por varios parametros separando por coma, por ejemplo

ORDER BY id DESC,nombre ASC

Sobre el otro error, te pediria que pusieras mas codigo de lo que tienes, el bucle y como haces para mostrar los datos.
  #8 (permalink)  
Antiguo 09/03/2010, 18:47
 
Fecha de Ingreso: febrero-2009
Mensajes: 580
Antigüedad: 15 años, 9 meses
Puntos: 13
Respuesta: Un poco liado, siempre hago dos consultas en lugar de una (o peor)

Código PHP:
$sql mysql_query("SELECT categorias.nombre,links.* AS nombrecat FROM categorias LEFT JOIN links ON categorias.id=links.idcat ORDER BY id DESC LIMIT $begin,$ipp");
echo 
"SELECT categorias.nombre,links.* AS nombrecat FROM categorias LEFT JOIN links ON categorias.id=links.idcat ORDER BY id DESC LIMIT $begin,$ipp<br>";
echo 
"Error numero: ".mysql_errno()." Descripcion: ".mysql_error();

     
$l=0;
     while(
$registro mysql_fetch_array($sql)){            
                        
                        
                        
                            
$url=$registro['url'];
                                
$nombre $registro['nombre'];
                                
$nombrecat $registro['nombrecat'];
                                echo 
'<p>'.$nombrecat.'</p>';


Simplmente asi no me me muestra nombrecat...
__________________
¿ya conoces la red social de cocina? descubre y comparte recetas de cocina
TONIWEB, un programador web freelance
  #9 (permalink)  
Antiguo 09/03/2010, 21:24
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 15 años, 3 meses
Puntos: 150
Respuesta: Un poco liado, siempre hago dos consultas en lugar de una (o peor)

Es que esto no tiene sentido: links.* AS nombrecat

■ links.* significa que recoge TODOS los campos de la tabla links
AS nombrecat es para renombrar 1 campo simple no con .*

Haz el SELECT campo por campo, algo asi (aunque tiene un error):

SELECT categorias.nombre,links.nombre,links.url from....

Si te fijas tenemos dos .nombre, eso no esta bien, es por eso que se usa el alias:

SELECT categorias.nombre as nombrecat,links.nombre,links.url from....

Asi ya tienes luego con $row["nombre"] el nombre del link y con $row["nombrecat"] el nombre de la categoria
  #10 (permalink)  
Antiguo 10/03/2010, 02:05
 
Fecha de Ingreso: febrero-2009
Mensajes: 580
Antigüedad: 15 años, 9 meses
Puntos: 13
Respuesta: Un poco liado, siempre hago dos consultas en lugar de una (o peor)

Conseguido! :D
__________________
¿ya conoces la red social de cocina? descubre y comparte recetas de cocina
TONIWEB, un programador web freelance
  #11 (permalink)  
Antiguo 10/03/2010, 02:46
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 15 años, 3 meses
Puntos: 150
Respuesta: Un poco liado, siempre hago dos consultas en lugar de una (o peor)



jeje, me alegro que te sirviera la explicacion, cualquier cosa relacionada con esto, sigue posteando aqui, estoy suscrito al tema y me avisa :)
  #12 (permalink)  
Antiguo 10/03/2010, 05:04
 
Fecha de Ingreso: febrero-2009
Mensajes: 580
Antigüedad: 15 años, 9 meses
Puntos: 13
Respuesta: Un poco liado, siempre hago dos consultas en lugar de una (o peor)

Muchas gracias! he intentado darte karma, pero se ve que ya te he dado :S
__________________
¿ya conoces la red social de cocina? descubre y comparte recetas de cocina
TONIWEB, un programador web freelance
  #13 (permalink)  
Antiguo 12/03/2010, 17:10
 
Fecha de Ingreso: febrero-2009
Mensajes: 580
Antigüedad: 15 años, 9 meses
Puntos: 13
Respuesta: Un poco liado, siempre hago dos consultas en lugar de una (o peor)

Bueno, situacion similiar

ahora en lugar de categorias.nombre, quisiera ratings.total_value y ratings.total_votes

pruebo asi

Cita:
$sql = mysql_query("SELECT ratings.total_value AS votos,ratings.total_votes AS nv,links.* FROM ratings LEFT JOIN links ON ratings.id=links.id ORDER BY votos DESC LIMIT $begin,$ipp");
y

Cita:
Cita:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/vol5/byethost32.com/b32_3523936/htdocs/php/best_rated.php on line 30

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/vol5/byethost32.com/b32_3523936/htdocs/php/best_rated.php on line 43

y no devuelve nada :?
__________________
¿ya conoces la red social de cocina? descubre y comparte recetas de cocina
TONIWEB, un programador web freelance
  #14 (permalink)  
Antiguo 12/03/2010, 18:05
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 15 años, 3 meses
Puntos: 150
Respuesta: Un poco liado, siempre hago dos consultas en lugar de una (o peor)

Puede ser por esto:

ORDER BY votos

Si existe el campo votos tanto en la tabla ratings como en la tabla links MYSQL no sabe cual tomar para ordenar, deberias poner por ejemplo

ORDER BY links.votos

Prueba a ver
  #15 (permalink)  
Antiguo 12/03/2010, 20:44
 
Fecha de Ingreso: febrero-2009
Mensajes: 580
Antigüedad: 15 años, 9 meses
Puntos: 13
Respuesta: Un poco liado, siempre hago dos consultas en lugar de una (o peor)



Gracias!
__________________
¿ya conoces la red social de cocina? descubre y comparte recetas de cocina
TONIWEB, un programador web freelance
  #16 (permalink)  
Antiguo 24/03/2010, 07:58
 
Fecha de Ingreso: febrero-2009
Mensajes: 580
Antigüedad: 15 años, 9 meses
Puntos: 13
Respuesta: Un poco liado, siempre hago dos consultas en lugar de una (o peor)

Ya estamos aqui otra vez.....

Llevo como 1 horita de prueba y error...

El caso es que esta consulta, si userSession esta seteado no me muestra nada, en caso contrario... si

Código PHP:
session_start();

$userRecent '';
if(isset(
$_GET['userSession'])){
    
$userRecent "WHERE iduser='".$_SESSION['id']."'";
    
$sqln mysql_query("SELECT * FROM links ".$userRecent);
    
$and " AND iduser = '".$_SESSION['id']."'";
}else
    
$sqln mysql_query("SELECT * FROM links ");
 




       
$page 0;
        if(isset(
$_GET['page'])){
            
$page $_GET['page'];    
        }
        
$next $page 1;
        
$prev $page 1;
        
$ipp 20;
        
         
$items mysql_num_rows($sqln);
         
$pages 00;
        
$pages $items/$ipp;    
        
$begin $page*$ipp;




if(isset(
$_GET['userSession']))
    
$sql mysql_query("SELECT categorias.nombre AS nombrecat,links.*  FROM categorias LEFT JOIN links ON categorias.id=links.idcat ".$and." ORDER BY id DESC LIMIT $begin,$ipp");
else
    
$sql mysql_query("SELECT categorias.nombre AS nombrecat,links.*  FROM categorias LEFT JOIN links ON categorias.id=links.idcat ORDER BY id DESC LIMIT $begin,$ipp");


     
$l=0;
     while(
$registro mysql_fetch_array($sql)){ 
Comentar que he partido de este Documento sin los condicionales (es decir, siempre en el caso ELSE) y funciona perfectamente.... :?

Veis algun error?

Muchas gracais!
__________________
¿ya conoces la red social de cocina? descubre y comparte recetas de cocina
TONIWEB, un programador web freelance

Etiquetas: dos, siempre
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

SíEste tema le ha gustado a 1 personas




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