Ver Mensaje Individual
  #5 (permalink)  
Antiguo 15/04/2013, 10:56
Avatar de gnzsoloyo
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)