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

[SOLUCIONADO] Consulta de totales compleja

Estas en el tema de Consulta de totales compleja en el foro de Mysql en Foros del Web. Buenas noches, estoy atascadísimo en una consulta que quiero hacer, espero conseguir explicarme bien. De momento tengo esta consulta creada, lo que quiero conseguir, es ...
  #1 (permalink)  
Antiguo 11/04/2013, 20:52
 
Fecha de Ingreso: septiembre-2009
Mensajes: 27
Antigüedad: 14 años, 7 meses
Puntos: 0
Consulta de totales compleja

Buenas noches, estoy atascadísimo en una consulta que quiero hacer, espero conseguir explicarme bien.

De momento tengo esta consulta creada, lo que quiero conseguir, es un sugerir canciones, por lo tanto tiene que cumplir la condición de que no la tenga en "me gusta" como usuario.

El problema que tengo es que hago el WHERE lc_usu!=1 y lo que me hace es simplemente no contarme los registros cuando soy el usuario 1, lo que quiero es que la cancion no aparezca en el select cuando encuentre la relacion de ese usuario con la cancion, osea el lc_cancion=x AND lc_usu=1.

Espero que se haya entendido mi problema, un saludo y gracias de antemano!

Código MySQL:
Ver original
  1. SELECT musica.mu_id,mu_nombre, COUNT(likecancion.lc_cancion) AS total
  2. FROM musica INNER JOIN likecancion ON musica.mu_id = likecancion.lc_cancion
  3. WHERE mu_id IN (SELECT lc_cancion FROM likecancion WHERE lc_usu != 1)
  4. AND mu_activo = 1
  5. AND (mu_lista LIKE '%07%')
  6. GROUP BY likecancion.lc_cancion
  7. LIMIT 0,30

Código:
musica
mu_id 	int(11)
mu_activo 	int(11)
mu_lista varchar(255)
Código:
likecancion
lc_id int(11)
lc_cancion int(11)
lc_usu 	int(11)
  #2 (permalink)  
Antiguo 11/04/2013, 21:04
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: Consulta de totales compleja

Partamos desde algo simple.
Esto te devolverá todo lo que está en la primera tabla, que no esté relacionado con ningún registro de la segunda:
Código MySQL:
Ver original
  1.     M.mu_id,
  2.     M.mu_nombre
  3.     musica M
  4.     LEFT JOIN likecancion L ON musica.mu_id = likecancion.lc_cancion
  5.     L.lc_cancion IS NULL
  6.     AND M.mu_activo = 1
  7. LIMIT 0,30
O sea, todas las canciones que no tienen ningún "like" en la segunda tabla.
A eso deberías agregarle que restrinja solamente al usuario de la segunda tabla:
Código MySQL:
Ver original
  1.     M.mu_id,
  2.     M.mu_nombre
  3.     musica M
  4.     LEFT JOIN likecancion L ON musica.mu_id = likecancion.lc_cancion
  5.     L.lc_cancion IS NULL
  6.     AND M.mu_activo = 1
  7.     AND L.lc_usu = valorbuscado
LIMIT 0,30
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 11/04/2013, 21:12
 
Fecha de Ingreso: septiembre-2009
Mensajes: 27
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Consulta de totales compleja

Perdona mi ignorancia pero no consigo seguirte que quieres conseguir con el L.lc_cancion IS NULL?

Mi problema está en que tengo que hacer el COUNT para ordenarlos por cantidad de likes, y al hacer el lc_usu!=1 lo unico que consigo es que no cuente los likes de este id, no consigo que esa cancion no entre en el select

Última edición por Darkmarine; 11/04/2013 a las 21:19
  #4 (permalink)  
Antiguo 11/04/2013, 21:22
 
Fecha de Ingreso: septiembre-2009
Mensajes: 27
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Consulta de totales compleja

estoy dandole vueltas a tu codigo, y entiendo por donde vas, lo que haces es buscar las canciones que aun no tengan like, para proponerlas.

Yo lo habia hecho más complejo para de esta forma sacar dentro de las más valoradas, canciones que aun no tenga, pero bueno al menos con esto ya puedo sacar algo.
  #5 (permalink)  
Antiguo 11/04/2013, 21:23
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: Consulta de totales compleja



Cita:
esas dos consultas están relacionadas de alguna manera?
Por supuesto que lo están. Si no, no usaría JOIN...
Estoy siguiendo la misma lógica que tu, sólo que asumo (por lo poco que describes del modelo de datos) lo siguiente:
1) La tabla MUSICA contiene una lista de canciones (no repetidas).
2) La tabla LIKECANCION, es una tabla relacional (cardinalidad N:N) que contiene un registro por cada canción que a un usuario dado (cuya tabla no aparece en tu esquema descripto), ha declarado que le gusta (no sé como, y no me interesa tampoco porque no afecta a la consulta).

En ese contexto, LEFT JOIN devuelve (como ya te dije), todo lo de la primera tabla, esté o no relacionado con la segunda. Ahora bien, como le digo que considere que un campo de la segunda tabla (el campo relación), debe ser NULL, devolverá todas las canciones que no han sido seleccionadas por ningún usuario.
SI además le digo que de la segunda tabla sólo tome aquellas elegidas alguna vez por un usuario determinado, me devolverá sólo aquellas canciones que ese usuario no ha declarado como "me gusta"... que es exactamente lo que dijiste.
Cita:
lo que quiero conseguir, es un sugerir canciones, por lo tanto tiene que cumplir la condición de que no la tenga en "me gusta" como usuario.
Ahora bien, si no conoces el funcionamiento de LEFT JOIN, estamos en serios problemas.
__________________
¿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 11/04/2013, 21:32
 
Fecha de Ingreso: septiembre-2009
Mensajes: 27
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Consulta de totales compleja

Con lo que me has dicho he probado esto pero no me sale ningún resultado

Código MySQL:
Ver original
  1. SELECT M.mu_id FROM musica as M
  2. LEFT JOIN likecancion as L ON M.mu_id = L.lc_cancion
  3. WHERE L.lc_cancion IS NULL
  4. AND M.mu_activo = 1
  5. AND (M.mu_lista LIKE '%01%')
  6. AND L.lc_usu = 1
  #7 (permalink)  
Antiguo 11/04/2013, 21:41
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: Consulta de totales compleja

SI no te sale ningún resultado es porque no hay registros que cumplan todas las condiciones.
Pero afinemos el tema:
Código MySQL:
Ver original
  1. SELECT M.mu_id
  2. FROM musica M
  3.     LEFT JOIN
  4.     (SELECT * FROM likecancion WHERE lc_usu = 1 ) L ON M.mu_id = L.lc_cancion
  5. WHERE L.lc_cancion IS NULL
  6.     AND M.mu_activo = 1
  7.     AND M.mu_lista LIKE '%01%'
  8. LIMIT 0,30

Notas:
1) AS es obsoleto. No lo uses.
2) No pongas paréntesis por que sí. Por propiedad distributiva esto:
Cita:
A = 1 AND (B = 0)
es igual a
Cita:
A = 1 AND B = 0
Pero el parser de MySQL pretende interpretarlo de otra forma y genera operaciones de evaluación innecesarias.
__________________
¿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 11/04/2013, 21:42
 
Fecha de Ingreso: septiembre-2009
Mensajes: 27
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Consulta de totales compleja

El problema que tengo con la consulta y lo que creo pasa es que busca si la cancion no tiene registros, sino no las saca, no esta cumpliendo la condicion de no sacar las canciones que yo ya haya dado.
  #9 (permalink)  
Antiguo 11/04/2013, 21:44
 
Fecha de Ingreso: septiembre-2009
Mensajes: 27
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Consulta de totales compleja

Con este ultimo SQL que has puesto si que me saca los que no tengo!! :D
  #10 (permalink)  
Antiguo 11/04/2013, 21:46
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: Consulta de totales compleja

Prueba la segunda versión de la consulta, y si no funciona, postea los create table y una muestra de los datos.
Lo que te advierto es que si el usuario que pones ya dio LIKE a todas las canciones de la lista que cumplan las otras dos condiciones, no te saldrá nada.
El tema no es en ese caso el LEFT JOIN, sino las condiciones que pones.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 11/04/2013, 21:47
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: Consulta de totales compleja

OK.
Bueno, me alegro que lo lograras.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 11/04/2013, 21:49
 
Fecha de Ingreso: septiembre-2009
Mensajes: 27
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Consulta de totales compleja

Muchísimas gracias por la ayuda gnzsoloyo! la verdad es que eres un crack, me das envidia porque siempre me quedo con que hago chapuzas a la hora de hacer busquedas las cuales no son optimas, pero aprendo sobre la marcha y por desgracia no tengo tiempo para empaparme libros o estudiar.

Un saludo desde el Norte de España

Etiquetas: agrupar
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 10:21.