【问题标题】:MySQL Subquery with main query data variable具有主查询数据变量的 MySQL 子查询
【发布时间】:2011-08-29 02:39:40
【问题描述】:

好的,这里需要一位 MySQL 大师。我正在尝试编写一个查询,当有人对您之前评论过的项目发表评论时,该查询将用作通知系统。 'drinkComment' 表非常简单:

commentID, userID, drinkID, datetime, comment

我已经编写了一个查询,它将获取我之前评论过的所有关于饮料的 cmets(不是我的),但它仍会显示在我发表评论之前发生的 cmets。这与我认为可行的方法一样接近,但事实并非如此。请帮忙!

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

【问题讨论】:

    标签: mysql select subquery


    【解决方案1】:

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

    【讨论】:

    • 不完全是这样,但我修改了它才能工作!非常感谢!将第一个“FROM DrinkComments”改为“FROM DrinkComments AS a”,而不是中间的。
    【解决方案2】:

    为什么不从用户的预查询开始,他们提供了 cmets 的所有饮料以及什么时候提供的(不知道对于任何给定的饮料,每人是否有多个 cmets)。然后,在您的日期/时间评论之后从所有其他人那里找到 cmets...

    这个查询实际上应该更快,因为它以一个用户的饮料 cmets 为基础开始,然后返回到匹配饮料 ID 和截止时间的 cmets 表。

    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
    

    【讨论】:

    • 非常好的解决方案!工作并且执行得更快!谢谢!
    • @AdamWeeks,我们在帮助他人时尝试提供有效的解决方案...您始终可以更改“已检查”的答案,以帮助未来的人们获得比第一个更好的解决方案。
    • +1 很棒的子查询教程。没有意识到我需要 FROM 部分中的子查询来访问其在主查询中的结果
    猜你喜欢
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多