2011-05-19 15 views
8

Ok, necesito un gurú de MySQL aquí. Estoy tratando de escribir una consulta que servirá como un sistema de notificación para cuando alguien deja un comentario sobre un elemento que ha comentado anteriormente. La tabla 'drinkComment' es muy simple:Subconsulta de MySQL con variable de datos de consulta principal

commentID, userID, drinkID, datetime, comment 

He escrito una consulta que va a conseguir todos los comentarios sobre las bebidas que he comentado anteriormente en (que no son mías), pero todavía mostrará comentarios eso ocurrió ANTES de mi comentario. Esto es lo más parecido a lo que creo que funcionaría, pero no es así. ¡Por favor ayuda!

select @drinkID:=drinkComments.drinkID, commentID, drinkID, userID, comment, datetime 
FROM drinkComments 
WHERE `drinkID` IN 
    (select distinct drinkID from drinkComments where drinkComments.userID = 1) 
AND drinkComments.dateTime > (
/*This gets the last date user commented on the main query's drinkID*/ 
select datetime FROM drinkComments WHERE drinkComments.userID = 1 AND drinkComments.drinkID = @drinkID ORDER BY datetime DESC LIMIT 1 
) 
ORDER BY datetime DESC 

Respuesta

10

por qué no empezar con una la consulta previa del usuario y todas las bebidas que han ofrecido los comentarios ya partir de qué momento (no sé si tiene varios comentarios por persona para cualquier bebida determinada o no). Luego, encuentre comentarios de todos los demás DESPUÉS de su comentario de fecha/hora ...

Esta consulta debería ser más rápida ya que COMENZANDO con solo comentarios de bebida de UN SOLO usuario como base, LUEGO vuelve a la tabla de comentarios para aquellos que coinciden con la ID de bebida y el tiempo de corte.

SELECT STRAIGHT_JOIN 
     dc.* 
    from 
     (select 
       drinkID, 
       max(datetime) UserID_DrinkCommentTime 
      FROM 
       drinkComments 
      WHERE 
       userID = 1 
      group by 
       drinkID) PreQuery 
     join DrinkComments dc 
     on PreQuery.DrinkID = dc.DrinkID 
     and dc.datetime > PreQuery.UserID_DrinkCommentTime 
    order by 
     dc.DateTime desc 
+0

¡Muy buena solución! ¡Funciona y funciona más rápido! ¡Gracias! – adamweeks

+0

@AdamWeeks, tratamos de ofrecer soluciones eficientes cuando ayudamos a otros ... Siempre puede cambiar la respuesta "comprobada" para ayudar a las personas futuras a obtener la mejor solución que la primera. – DRapp

+0

+1 Gran tutorial de subconsulta. No me di cuenta de que necesitaba la subconsulta en la sección 'FROM' para acceder a sus resultados en la consulta principal – foochow

2

Creo que necesita relacionar su consulta más interna a la consulta del medio por drinkID.

select @drinkID:=drinkComments.drinkID, commentID, drinkID, userID, comment, datetime 
FROM drinkComments 
WHERE `drinkID` IN 
    (select distinct drinkID from drinkComments AS a where drinkComments.userID = 1) 
AND drinkComments.dateTime > (
/*This gets the last date user commented on the main query's drinkID*/ 
select datetime FROM drinkComments WHERE drinkComments.userID = 1 AND drinkComments.drinkID = a.drinkID ORDER BY datetime DESC LIMIT 1 
) 
ORDER BY datetime DESC 
+0

Eso no fue exactamente, pero lo modifiqué para funcionar! ¡Muchas gracias! Hizo la primera "FROM drinkComments" a "FROM drinkComments AS a" en lugar de la del medio. – adamweeks

+0

Disculpa, estaba editando mi comentario. – adamweeks

Cuestiones relacionadas