Problema consulta SQL

EnZo

Vengo aqui porque llevo toda la tarde intentando hacerlo, me explico:

Tengo tres tablas. Un usuario puede publicar varios videos, los videos pueden ser votados una vez por cada usuario.

http://img36.picoodle.com/img/img36/8/6/28/f_Untitled4m_7b07860.jpg

Mi problema viene cuando quiero listar los videos diferenciandolos de si ha sido votado por el usuario que esta generando el listado.

Es decir conozco la ip y el id del usuario y al mostrar el listado de videos con una sola consulta tengo que saber si ese video ya esta votado por el usuario en cuestion.

La ip del usuario o el id es lo que uso para saber si se ha votado. Es decir que un usuario no registrado puede votar una sola vez y se almacenara su ip mientras que su id sera 0.

Es el mismo funcionamiento de meneame.net

No consigo hacerlo de ninguna manera. Y no quiero hacer una consulta por cada video xq en cada listado podrian ser 20 consultas y no me convence nada.

Probando con subconsulta:
SELECT titulo, id_video AS idVid, (SELECT id_usuario, ip FROM votos WHERE (id_usuario=6 OR ip='127.0.0.1') AND id=idVid))
FROM v_video
ORDER BY fecha DESC , publicacion DESC

Probando con inner join:
SELECT titulo, id_video, votos.id_usuario, votos.ip
FROM v_video
INNER JOIN votos ON votos.id_usuario=6 OR votos.ip = '127.0.0.1'

Ninguno me va :( Si alguien se le ocurre como hacerlo me seria de gran ayuda gracias.

SeiYa

Yo no uso Inner's Join pero haría:

SELECT (campos que quieres) FROM v_videos WHERE v_videos.id_video_mint NOT IN (SELECT votos.id_video_mint FROM votos WHERE votos.id_usuario_mint = IDDETUUSUARIO)

Básicamente es:

[Dame todos los videos cuya id no esté en el listado:

[Dame todos las id's de los videos votados por el usuario.]]

Un saludo.

IS4kO

Creo q con la consulta anidada de SeiYa resolveras muy bien el problema...

Aunque mi consejo es que cuando tienes la información distribuida (y muy bien por cierto).... es cruzar las distintas tablas, de esta forma, con una sola consulta podrás sacar todo los datos y detalles que quieras

Select t3.id_video_mint as video from u_usuarios t1, v_videos t2, votos t3
where
t1.id_usuario_mint = t2.id_usuario_mint and
t2.id_video_mint = t3.id_video_mint and
t1.id_usuario_mint = 'IDUSUARIO'

En esta consulta, podrías sacar todos lo videos votados por el IDUSUARIO que le has indicado, pero podrías tb filtrar por la IP, y complicarla todo lo que quisieras, posibles futuras estadísticas, como por ejemplo, sacar que categoría es la preferida por el usuario, etc... etc...

Salu2

EnZo

en cuanto pueda las pruebo gracias a los dos

EnZo

SELECT v_video.titulo, v_video.id_video, IF(v_video.id_video IN(SELECT id FROM votos WHERE id_usuario=7 OR ip='127.0.0.1'), 1, 0) AS votado
FROM v_video
ORDER BY v_video.fecha DESC

Esta es mi consulta final (un poco reducida) lo de seiya no me valia pero me ha dado la clave thanks ;)
En el campo votado si aparece un 1 esque ha votado ese video si es un 0 no.

Y ahora una duda sobre optimizacion.
Este proceso lo hago con una consulta pero que seria mas optimo hacer previamente una consulta que me liste esto:
SELECT id FROM votos WHERE id_usuario=7 OR ip='127.0.0.1' para luego meterselos al IN en la segunda consulta (IN(657,784,587,458)) o dejarlo como está?
Esque tal y como lo veo me da la impresion de que hace una subconsulta por cada registro que me va a mostrar, y ahora no se nota pero cuando hay 1000 videos y el usuario haya hecho 300 votos...
Esque no se como rula SQL internamente.

Que opinais?

IS4kO

No se si SQL va lanzando las subconsultas en distintos threads o van esperando en cola.....

Así que no sabría que decirte... solo que probaras el rendimiento con las dos opciones, por norma general cuantas más subconsultas más requerimiento de recursos...

Yo por normal general obtengo menos tiempo de carga cruzando las tablas (de ahí mi primer post) y ajustando bien los filtros de select, aunque suelo hacerlo vs oracle, desconozco si la ejecución interna es distinta a la de SQL

Usuarios habituales

  • IS4kO
  • EnZo
  • SeiYa