2011-05-19 114 views
8

好的,这里需要一个MySQL专家。我正在尝试编写一个查询,作为通知系统,以便有人对您之前评论过的项目发表评论。该“drinkComment”表是非常简单的:主查询数据变量的MySQL子查询

commentID, userID, drinkID, datetime, comment 

我写了一个查询,将得到所有的意见,对我以前评论过的饮料(即不是我的),但它仍然会显示评论发生在我的评论之前。这与我认为会工作的一样接近,但事实并非如此。请帮忙!

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 

回答

10

为什么不与用户的prequery和所有他们所提供的意见饮料开始,作为什么时间(不知道你是否有每人多条评论,对于任何给定的饮料或没有)。然后,在你的日期/时间评论之后找到所有其他人的评论...

这个查询实际上应该更快,因为它只有一个用户的饮料评论作为基础,然后返回评论表那些匹配饮品ID和截止时间的人。

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

非常好的解决方案!工作并确实执行得更快!谢谢! – adamweeks 2011-05-19 18:49:05

+0

@AdamWeeks,我们试图在帮助他人时提供高效的解决方案...您可以随时更改“已检查”的答案,以帮助未来的人们获得比第一个更好的解决方案。 – DRapp 2011-05-20 02:33:06

+0

+1很棒的子查询教程。没有意识到我需要'FROM'部分中的子查询来访问主查询中的结果 – foochow 2013-04-27 21:50:49

2

我认为你需要通过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

这不完全是它,但我改变它的工作!非常感谢!将第一个“FROM drinkComments”改为“FROM drinkComments AS a”而不是中间的。 – adamweeks 2011-05-19 18:21:56

+0

对不起,编辑我的评论。 – adamweeks 2011-05-19 18:24:06