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

Error en consulta anidada

Estas en el tema de Error en consulta anidada en el foro de Mysql en Foros del Web. Buenas tardes!! Me estoy comiendo la cabeza... estoy haciendo una consulta que a su vez me mire en otra tabla y me saque el resultado, ...
  #1 (permalink)  
Antiguo 15/04/2013, 08:40
 
Fecha de Ingreso: abril-2013
Mensajes: 7
Antigüedad: 11 años
Puntos: 0
Error en consulta anidada

Buenas tardes!!

Me estoy comiendo la cabeza... estoy haciendo una consulta que a su vez me mire en otra tabla y me saque el resultado, NULL si no lo encuentra o el nombre si SI lo encuentra.

Si ejecuto la select en mi phpMyadmin me funciona correctamente pero luego... cuando la llevo a Dreamweaver y la prueba me da error...

Por partes...

Esta es la select que si lanzo en phpMyAdmin funciona correctamente...
Código MySQL:
Ver original
  1. SELECT tblusuario.strUsuario, tblusuario.intFutbol7, tblusuario.intFutbol11, tblusuario.intFutbolSala, tblusuario.intRunning, tblusuario.intCiclismo, tblusuario.intFitness, tblusuario.intBaloncesto, tblusuario.intPadel, ( SELECT tblcontactos.strAmigos FROM tblcontactos WHERE tblcontactos.strUsuario = 'danipm' AND tblcontactos.strAmigos = tblusuario.strUsuario ) amigo FROM tblusuario WHERE tblusuario.strUsuario LIKE '%' AND tblusuario.intFutbol7 LIKE '%' AND tblusuario.intFutbol11 LIKE '%' AND tblusuario.intFutbolSala LIKE '%' AND tblusuario.intRunning LIKE '%' AND tblusuario.intCiclismo LIKE '%' AND tblusuario.intFitness LIKE '%' AND tblusuario.intBaloncesto LIKE '%' AND tblusuario.intPadel LIKE '%'

Luego la modifico un poco para meterla en Dreamweaver y que me muestre de 20 en 20 los registros...
Código MySQL:
Ver original
  1. SELECT tblusuario.strUsuario, tblusuario.intFutbol7, tblusuario.intFutbol11, tblusuario.intFutbolSala, tblusuario.intRunning, tblusuario.intCiclismo, tblusuario.intFitness, tblusuario.intBaloncesto, tblusuario.intPadel, ( SELECT tblcontactos.strAmigos FROM tblcontactos WHERE tblcontactos.strUsuario = %s AND tblcontactos.strAmigos = tblusuario.strUsuario ) amigo FROM tblusuario WHERE tblusuario.strUsuario LIKE %s AND tblusuario.intFutbol7 LIKE '%' AND tblusuario.intFutbol11 LIKE '%' AND tblusuario.intFutbolSala LIKE '%' AND tblusuario.intRunning LIKE '%' AND tblusuario.intCiclismo LIKE '%' AND tblusuario.intFitness LIKE '%' AND tblusuario.intBaloncesto LIKE '%' AND tblusuario.intPadel LIKE '%'",
  2.         GetSQLValueString($_GET["usuario"], "text"),
  3.         GetSQLValueString($_GET["usuario"], "text"))
  4. LIMIT %d, %d
se la paso a traves de otra pantalla.

El error que me da es....

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 0, 20' at line 1

¿podeis echarme un mano?? no sé que estoy haciendo mal...

Última edición por gnzsoloyo; 15/04/2013 a las 08:49 Razón: Condigo de programacion no permitido en Foros de BBDD
  #2 (permalink)  
Antiguo 15/04/2013, 08:59
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, 5 meses
Puntos: 2658
Respuesta: Error en consulta anidada

Por lo pronto, no postees bloques de código de programación en los foros de BBDD. No permiten ver realmente qué errores son reales y cuáles producto de una programación defectuosa.
Para PHP hay un foro específico.
Por otro lado, no es buena práctica poner subconsultas en el SELECT, y menos si tienen el potencial de generar resultados múltiples. Antes te conviene realizar un buen JOIN.
también te conviene escribir el código más estructuradamente, cosa de hacerlo más legible, y usar los alias de las tablas, para evitar confusiones.
En definitiva, tu código inicial se puede depurar así:
Código MySQL:
Ver original
  1.     U.strUsuario,
  2.     U.intFutbol7,
  3.     U.intFutbol11,
  4.     U.intFutbolSala,
  5.     U.intRunning,
  6.     U.intCiclismo,
  7.     U.intFitness,
  8.     U.intBaloncesto,
  9.     U.intPadel,
  10.     A.strAmigos amigo
  11. FROM tblusuario U LEFT JOIN tblcontactos C ON U.strUsuario = C.strAmigos
  12.     U.strUsuario = %s
  13.     AND U.intFutbol7 LIKE '%'
  14.     AND U.intFutbol11 LIKE '%'
  15.     AND U.intFutbolSala LIKE '%'
  16.     AND U.intRunning LIKE '%'
  17.     AND U.intCiclismo LIKE '%'
  18.     AND U.intFitness LIKE '%'
  19.     AND U.intBaloncesto LIKE '%'
  20.     AND U.intPadel LIKE '%'
  21. LIMIT %d, %d

Sobre esta base, hay que ver qué le estás agregando y cómo, por lo que te recomiendo que captures con un echo la consulta que realmente se está enviando a la base, una vez que has incorporado los valores de las variables.
A partir de allí veremos qué estás haciendo mal.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 15/04/2013 a las 10:11
  #3 (permalink)  
Antiguo 15/04/2013, 10:09
 
Fecha de Ingreso: abril-2013
Mensajes: 7
Antigüedad: 11 años
Puntos: 0
Respuesta: Error en consulta anidada

Gracias por todas las aclaraciones que me has hecho gnzsoloyo.

Me pongo ahora mismo con los cambios y os digo...
  #4 (permalink)  
Antiguo 15/04/2013, 10:34
 
Fecha de Ingreso: abril-2013
Mensajes: 7
Antigüedad: 11 años
Puntos: 0
Respuesta: Error en consulta anidada

Hola de nuevo...

Sigo sin conseguirlo... he modificado la sentencia como me has dicho.

SELECT
U.strUsuario,
U.intFutbol7,
U.intFutbol11,
U.intFutbolSala,
U.intRunning,
U.intCiclismo,
U.intFitness,
U.intBaloncesto,
U.intPadel,
C.strAmigos amigo
FROM tblusuario U RIGHT JOIN tblcontactos C ON U.strUsuario = C.strUsuario
WHERE
U.strUsuario LIKE '%'
AND U.intFutbol7 LIKE '%'
AND U.intFutbol11 LIKE '%'
AND U.intFutbolSala LIKE '%'
AND U.intRunning LIKE '%'
AND U.intCiclismo LIKE '%'
AND U.intFitness LIKE '%'
AND U.intBaloncesto LIKE '%'
AND U.intPadel LIKE '%'

Pero no me vale, eso no es lo que quiero, voy a intentar explicarme...

Tengo 2 tablas, una con usuarios (tblusuario) y otra en la que guardo si los usuarios son amigos ( tblcontactos, con un id, otro campo con el nombre del usuario, y otro campo con el nombre del otro usuario "usuario AMIGO" ) . Si no existe esa relacion sería porque no son amigos.

Entonces quiero un select para sacar TODOS los usuarios(tblusuario) que haya en la BD ( pudiendo filtrar por nombre, ej: LIKE 'da%' ) y que ademas me diga si es mi amigo o no. Por eso pensaba utilizar 2 select en una, como escribí en el primer mensaje.

Creo que la sentencia JOIN ... ON lo que me hace es sacarme solo los resultados que existan en ambas tablas, o al menos es lo que he entendido.

Espero haberme explicado.

Gracias de antemano por vuestro tiempo.

Un saludo.
  #5 (permalink)  
Antiguo 15/04/2013, 10:56
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, 5 meses
Puntos: 2658
Respuesta: Es posible colocar 0 en una consulta si falta un valor?

Cita:
Tengo 2 tablas, una con usuarios (tblusuario) y otra en la que guardo si los usuarios son amigos ( tblcontactos, con un id, otro campo con el nombre del usuario, y otro campo con el nombre del otro usuario "usuario AMIGO" ) . Si no existe esa relacion sería porque no son amigos.

Entonces quiero un select para sacar TODOS los usuarios(tblusuario) que haya en la BD ( pudiendo filtrar por nombre, ej: LIKE 'da%' ) y que ademas me diga si es mi amigo o no. Por eso pensaba utilizar 2 select en una, como escribí en el primer mensaje.
Mira, con lo primero ya se vuelve evidente cómo debería ser la consulta, y es básicamente como te la planteo, pero con algún agregado:
Código MySQL:
Ver original
  1.     U.strUsuario,
  2.     U.intFutbol7,
  3.     U.intFutbol11,
  4.     U.intFutbolSala,
  5.     U.intRunning,
  6.     U.intCiclismo,
  7.     U.intFitness,
  8.     U.intBaloncesto,
  9.     U.intPadel,
  10.     IF(A.strAmigos IS NULL, 'No Amigo', 'Amigo')  amigo
  11. FROM tblusuario U LEFT JOIN (SELECT * FROM tblcontactos WHERE A.strAmigos = 'valorbuscado') C ON U.strUsuario =  A.strUsuario
  12.     A.strUsuario IS NULL
  13. LIMIT %d, %d
Eso devuelve a todos los usuarios, indicando en la última columna si no son amigos.
O bien puedes filtrar sólo aquellos que no son amigos:
Código MySQL:
Ver original
  1.     U.strUsuario,
  2.     U.intFutbol7,
  3.     U.intFutbol11,
  4.     U.intFutbolSala,
  5.     U.intRunning,
  6.     U.intCiclismo,
  7.     U.intFitness,
  8.     U.intBaloncesto,
  9.     U.intPadel,
  10.     IFNULL(A.strAmigos, 'No Amigo')  amigo
  11. FROM tblusuario U LEFT JOIN (SELECT * FROM tblcontactos WHERE A.strAmigos = 'valorbuscado') C ON U.strUsuario =  A.strUsuario
  12.     A.strUsuario IS NULL
  13. LIMIT %d, %d
O bien, si quieres sólo los que lo son:
Código MySQL:
Ver original
  1.     U.strUsuario,
  2.     U.intFutbol7,
  3.     U.intFutbol11,
  4.     U.intFutbolSala,
  5.     U.intRunning,
  6.     U.intCiclismo,
  7.     U.intFitness,
  8.     U.intBaloncesto,
  9.     U.intPadel
  10. FROM tblusuario U INNER JOIN tblcontactos C ON U.strUsuario =  A.strUsuario
  11.     A.strAmigos = 'valorbuscado'
  12. LIMIT %d, %d
Si además quieres agregar todas las otras condicioens, te conviene ponerlas como condicionales, ya que no sabemos de entrada cuáles tienen datos y cuáles no:
Código MySQL:
Ver original
  1.     U.strUsuario,
  2.     U.intFutbol7,
  3.     U.intFutbol11,
  4.     U.intFutbolSala,
  5.     U.intRunning,
  6.     U.intCiclismo,
  7.     U.intFitness,
  8.     U.intBaloncesto,
  9.     U.intPadel
  10. FROM tblusuario U INNER JOIN tblcontactos C ON U.strUsuario =  A.strUsuario
  11.     A.strAmigos = 'valorbuscado'
  12.     AND (U.intFutbol7 LIKE '%'
  13.     OR U.intFutbol11 LIKE '%'
  14.     OR U.intFutbolSala LIKE '%'
  15.     OR U.intRunning LIKE '%'
  16.     OR U.intCiclismo LIKE '%'
  17.     OR U.intFitness LIKE '%'
  18.     OR U.intBaloncesto LIKE '%'
  19.     OR U.intPadel LIKE '%')
  20. LIMIT %d, %d
Un tip final: Trata de no usar LIKE tan indiscriminadamente. Es una de las cláusulas más destructoras de performance, porque puede terminar obligando al MYSQL a revisar toda la tabla (full table scan)... lo cual es una de la peores formas de consulta posible.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 16/04/2013, 09:20
 
Fecha de Ingreso: abril-2013
Mensajes: 7
Antigüedad: 11 años
Puntos: 0
Respuesta: Error en consulta anidada

Alguien me puede ayudar??

Sigo mirando y no lo consigo...

Alguna idea??
  #7 (permalink)  
Antiguo 16/04/2013, 09:28
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, 5 meses
Puntos: 2658
Respuesta: Error en consulta anidada

Lo siento, puse la respuesta de este en otro post tuyo...
La acabo de mover acá.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 16/04/2013, 11:14
 
Fecha de Ingreso: abril-2013
Mensajes: 7
Antigüedad: 11 años
Puntos: 0
Respuesta: Error en consulta anidada

Gracias por tu tiempo gnzsoloyo!!

Pero me surgen dudas... porque segun veo... no veo la diferencia entre lo que me has puesto y mi idea inicial porque al fin y al cabo sigues haciendo una subconsulta dentro de una consulta, no?? pero le metes el JOIN...

No lo acabo de entender...
  #9 (permalink)  
Antiguo 16/04/2013, 11:28
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, 5 meses
Puntos: 2658
Respuesta: Error en consulta anidada

Pues en realidad te he puesto cuatro formas de la consulta, que cubren cuatro criterios con diferencias. No son exactamente iguales.
Además, te aclaro en el post a qué es lo que apunta cada una, con lo que eso debería servirte de guía para intentar comprender la lógica, analizando las diferencias de sitaxis entre las consultas.
Aunque la idea inicial sea la misma, eso no quiere decir que no sea distinto el resultado. No te guíes por lo que está en el SELECT. Fíjate en FROM (orden de tablas y subconsultas), el WHERE, los paréntesis y las condiciones.
Como tip: El uso correcto de LEFT JOIN requiere de mucha experiencia para verlo simplemente leyendo la consulta. A veces no es fácil ni para los expertos.
__________________
¿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: php, registro, registros, select, sql, tabla
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 13:34.