我正在尝试获得与每个帖子相关的最新的1或2条评论,我下载,有点像instagram,因为他们显示每个帖子的最新3评论,到目前为止,我得到的帖子&喜欢的人数

现在我需要做的就是弄清楚如何获得最新的评论,而不是太确定如何处理它,这就是为什么我希望有更多专业知识的人可以帮助我!

这是我当前的查询:

(SELECT
        P.uuid,P.caption,P.imageHeight,P.path,P.date,U.id,U.fullname,U.coverImage,U.bio,U.username,U.profileImage,coalesce(Activity.LikeCNT,0),Activity.CurrentUserLiked
        FROM USERS AS U
        INNER JOIN Posts AS P 
        ON P.id = U.id
        LEFT JOIN (SELECT COUNT(disTINCT Activity.uuidPost) LikeCNT,Activity.uuidPost,Activity.id,sum(CASE WHEN Activity.id = $id then 1 else 0 end) as CurrentUserLiked
        FROM Activity Activity
        WHERE type = 'like' 
        GROUP BY Activity.uuidPost) Activity
        ON Activity.uuidPost = P.uuid
        AND Activity.id = U.id
        WHERE U.id = $id)
UNION
        (SELECT 
        P.uuid,Activity.CurrentUserLiked
        FROM Activity AS A
        INNER JOIN USERS AS U 
        ON A.IdOtherUser=U.id
        INNER JOIN Posts AS P 
        ON P.id = U.id
        LEFT JOIN (SELECT COUNT(disTINCT Activity.uuidPost) LikeCNT,sum(CASE WHEN Activity.id = $id then 1 else 0 end) as CurrentUserLiked
    FROM Activity Activity
    WHERE type = 'like' 
    GROUP BY Activity.uuidPost) Activity
    ON Activity.uuidPost = P.uuid
    AND Activity.id = U.id
    WHERE A.id = $id)
    ORDER BY date DESC
    LIMIT 0,5

基本上,评论是存储在与喜欢的同一张表中.

所以表是Activity,那么我有一个存储注释文本的列注释,然后“type”等于“comment”.

可能不是很好的解释,但我愿意尝试尽可能多的细节!

如果有人可以帮助它非常感谢!

UPDATE

在https://stackoverflow.com/users/1016435/xqbert给出的这个查询我现在得到这个错误:

Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation ‘=’

SELECT Posts.id,Posts.uuid,Posts.caption,Posts.path,Posts.date,USERS.id,USERS.username,USERS.fullname,USERS.profileImage,coalesce(A.LikeCNT,com.comment
FROM Posts 
INNER JOIN USERS 
  ON Posts.id = 145 
 AND USERS.id = 145
LEFT JOIN (SELECT COUNT(A.uuidPost) LikeCNT,A.UUIDPost
    FROM Activity A
    WHERE type =  'like' 
    GROUP BY A.UUIDPOST) A
 on A.UUIDPost=Posts.uuid
LEFT JOIN (SELECT comment,UUIDPOST,@row_num := IF(@prev_value=UUIDPOST,@row_num+1,1) as row_number,@prev_value := UUIDPOST
           FROM Activity 
           CROSS JOIN (SELECT @row_num := 1) x
           CROSS JOIN (SELECT @prev_value := '') y
           WHERE type = 'comment'
           ORDER BY UUIDPOST,date DESC) Com
  ON Com.UUIIDPOSt = Posts.UUID
 AND row_number <= 2
ORDER BY date DESC
LIMIT 0,5

最新编辑

表结构:

帖子

----------------------------------------------------------
    | id         | int(11)      |                 | not null |
    | uuid       | varchar(100) | utf8_unicode_ci | not null |
    | imageLink  | varchar(500) | utf8_unicode_ci | not null |
    | date       | timestamp    |                 | not null |
    ----------------------------------------------------------

USERS

-------------------------------------------------------------
    | id            | int(11)      |                 | not null |
    | username      | varchar(100) | utf8_unicode_ci | not null |
    | profileImage  | varchar(500) | utf8_unicode_ci | not null |
    | date          | timestamp    |                 | not null |
    -------------------------------------------------------------

活动

----------------------------------------------------------
    | id           | int(11)      |                 | not null |
    | uuid         | varchar(100) | utf8_unicode_ci | not null |
    | uuidPost     | varchar(100) | utf8_unicode_ci | not null |
    | type         | varchar(50)  | utf8_unicode_ci | not null |
    | commentText  | varchar(500) | utf8_unicode_ci | not null |
    | date         | timestamp    |                 | not null |
    ----------------------------------------------------------

这些是一些例子,在这种情况下的“活动”表中,“类型”将始终等于“注释”.

总结一切和欲望结果:

当我查询用户的帖子时,我想要进入“活动”表,并获得他所拥有的每个帖子的最新的2条评论.也许没有任何意见,这显然会返回0,也许这可以有100个评论.但我只想得到最新的/最新的2条评论.

一个例子可能在于Instagram如何看待它.对于每个帖子,显示最近的评论1,2或3 ….

希望这可以帮助!

Fiddle link

此错误消息

Illegal mix of collations (utf8_general_ci,IMPLICIT) and
(utf8_unicode_ci,IMPLICIT) for operation ‘=’

通常是由于您的列和表的定义.这通常意味着在等号的任一侧有不同的归类.您需要做的是选择一个,并在查询中包含该决定.

这里的排序规则是在@prev_value的CROSS JOIN中,需要使用明确的排序规则.

我还将“row_number”逻辑略微更改为单个交叉连接,并将if逻辑移动到选择列表的极限.

下面显示一些样品数据.需要样本数据来测试查询.任何试图通过实例解答您的问题的人都需要数据.我在这里包括的原因有两个方面.

所以你会明白我所呈现的任何结果
>以便将来当您提出另一个sql相关问题时,您将了解提供数据的重要性.这样做不仅对我们更方便.如果asker提供样本数据,那么asker将已经明白了 – 这不会是一些陌生人的发明,他们花了一些时间来帮助他们.

样品数据

请注意表中缺少一些列,仅包括表格详细信息中指定的列.

此示例数据针对单个帖子有5条评论(没有喜欢的记录)

CREATE TABLE Posts 
(
`id` int,`uuid` varchar(7) collate utf8_unicode_ci,`imageLink` varchar(9) collate utf8_unicode_ci,`date` datetime
 );

INSERT INTO Posts(`id`,`uuid`,`imageLink`,`date`)
VALUES
(145,'abcdefg','blah blah','2016-10-10 00:00:00') ;

CREATE TABLE   USERS
(
`id` int,`username` varchar(15) collate utf8_unicode_ci,`profileImage` varchar(12) collate utf8_unicode_ci,`date` datetime
) ;

INSERT INTO     USERS(`id`,`username`,`profileImage`,'used_by_already','blah de blah','2014-01-03 00:00:00') ;


CREATE TABLE Activity
(
`id` int,`uuid` varchar(4) collate utf8_unicode_ci,`uuidPost` varchar(7) collate utf8_unicode_ci,`type` varchar(40) collate utf8_unicode_ci,`commentText` varchar(11) collate utf8_unicode_ci,`date` datetime
) ;

INSERT INTO Activity (`id`,`uuidPost`,`type`,`commentText`,`date`)
 VALUES
(345,'a100','comment','lah lha ha','2016-07-05 00:00:00'),(456,'a101','lah lah lah','2016-07-06 00:00:00'),(567,'a102','lha lha ha','2016-07-07 00:00:00'),(678,'a103','ha lah lah','2016-07-08 00:00:00'),(789,'a104','hla lah lah','2016-07-09 00:00:00') ;

[sql标准行为:每个Post查询2行]

这是我的初步查询,并进行了一些更正.我更改了选择列表的列顺序,以便当我提供结果时,您会看到一些注释相关的数据.请研究他们提供的结果,以便您可以了解查询将会做什么.由于我已经注意到的原因,我正在处理的样本数据中不存在#前面的列.

SELECT
      Posts.id,rcom.uuidPost,rcom.commentText,rcom.`date` commentDate 
    #,Posts.caption
    #,Posts.`date`,USERS.username
    #,COALESCE(A.LikeCNT,0) num_likes
FROM Posts
INNER JOIN USERS ON Posts.id = 145
            AND USERS.id = 145
LEFT JOIN (
          SELECT
                COUNT(A.uuidPost) LikeCNT,A.UUIDPost
          FROM Activity A
          WHERE type = 'like'
          GROUP BY
                A.UUIDPOST
          ) A ON A.UUIDPost = Posts.uuid 
LEFT JOIN (
      SELECT
            @row_num := IF(@prev_value=UUIDPOST,commentText,uuidPost,`date`,@prev_value := UUIDPOST
      FROM Activity
      CROSS JOIN ( SELECT @row_num := 1,@prev_value := '' collate utf8_unicode_ci  ) xy
      WHERE type = 'comment'
      ORDER BY
            uuidPost,`date` DESC
      ) rcom ON rcom.uuidPost  = Posts.UUID
            AND rcom.row_number <= 2
ORDER BY
      posts.`date` DESC
      ;

See a working demonstration of this query at SQLFiddle

Results:

|  id |    uuid | uuidPost | commentText |                   date |                      date |  id |        username | profileImage | num_likes |
|-----|---------|----------|-------------|------------------------|---------------------------|-----|-----------------|--------------|-----------|
| 145 | abcdefg |  abcdefg | hla lah lah | July,09 2016 00:00:00 | October,10 2016 00:00:00 | 145 | used_by_already | blah de blah |         0 |
| 145 | abcdefg |  abcdefg |  ha lah lah | July,08 2016 00:00:00 | October,10 2016 00:00:00 | 145 | used_by_already | blah de blah |         0 |

有2个ROWS – 如预期.最近一次评论的一行,以及下一个最近评论的另一行.这是sql的正常行为,直到在此答案下添加评论时,问题的读者会认为这种正常行为是可以接受的.

这个问题缺乏明确的“预期成果”.

[选项1:每个Post查询一行,最多2个评论,添加列]

在下面的评论中,显示您不需要每个帖子2行,这将是一个简单的修复.那么它很简单,但是有选项,选项由用户以需求的形式决定.如果这个问题有一个“预期的结果”,那么我们知道选择哪个选项.不过这里有一个选择

SELECT
      Posts.id,max(case when rcom.row_number = 1 then rcom.commentText end) Comment_one,max(case when rcom.row_number = 2 then rcom.commentText end) Comment_two
    #,`date` DESC
      ) rcom ON rcom.uuidPost  = Posts.UUID
            AND rcom.row_number <= 2
GROUP BY
      Posts.id,Posts.uuid
    #,0)
ORDER BY
      posts.`date` DESC
      ;

See the second query working at SQLFiddle

Results of query 2:

|  id |    uuid | Comment_one | Comment_two |                      date |  id |        username | profileImage | num_likes |
|-----|---------|-------------|-------------|---------------------------|-----|-----------------|--------------|-----------|
| 145 | abcdefg | hla lah lah |  ha lah lah | October,10 2016 00:00:00 | 145 | used_by_already | blah de blah |         0 |

**选项2,将最近的评论连接成一个逗号分隔的列表**

SELECT
      Posts.id,group_concat(rcom.commentText) Comments_two_concatenated
    #,0)
ORDER BY
      posts.`date` DESC

See this third query working at SQLFiddle

Results of query 3:

|  id |    uuid | Comments_two_concatenated |                      date |  id |        username | profileImage | num_likes |
|-----|---------|---------------------------|---------------------------|-----|-----------------|--------------|-----------|
| 145 | abcdefg |    hla lah lah,ha lah lah | October,10 2016 00:00:00 | 145 | used_by_already | blah de blah |         0 |

**摘要**

我已经提交了3个查询,每个查询仅显示最近的2个注释,但每个查询都以不同的方式进行.第一个查询(默认行为)将为每个帖子显示2行.选项2添加一列,但删除第二行.选项3连接2个最近的评论.

请注意:

>问题缺少涵盖所有列的表定义
>该问题缺少任何样本数据,这使得您更难了解此处提供的任何结果,但也更难为我们准备解决方案
>这个问题还没有确定的“预期结果”(需要的输出),这导致了回答的进一步复杂化

我希望附加的提供的信息将会有一些用处,而且现在你也知道sql将数据呈现为多行是正常的.如果您不想要正常的行为,请具体说明您在问题中真正想要的内容.

后记.要包括另一个子查询“跟随”,您可以使用与您已有的子查询相似的子查询.它可以在该子查询之前或之后添加.您也可以在sqlfiddle here看到它的使用

LEFT JOIN (
          SELECT
                COUNT(*) FollowCNT,IdOtherUser
          FROM Activity
          WHERE type = 'Follow'
          GROUP BY
                IdOtherUser
          ) F ON USERS.id = F.IdOtherUser

当添加另一个子查询可能会解决您对更多信息的需求时,总体查询可能会随数据增长而变慢.一旦您确定了您真正需要的功能,可能会考虑在这些表上需要哪些索引. (我相信你会被建议单独要求这个建议,如果你确实包括1.你的表的完整DDL和2.查询的解释计划.)

php – MYSQL查询 – 获取与该帖子相关的最新评论的更多相关文章

  1. 对于NSManagedObject,Xcode 9构建了Date vs NSDate的问题

    Xcode9为模拟器与设备中的实体的Date类型属性生成不同的代码.我在coredata中将类设置为类别/扩展名下的codegen功能.直到Xcode8.3(最新)它一切正常.下面是Xcode9为属性自动生成的代码–在设备上:–和,在模拟器上:–有谁遇到过这个问题?对于一个有50个成员的项目来解决这个问题的最佳解决方案是什么,直到Xcode更新修复它?

  2. iOS兼容输入类型日期 – 设置最小值最大值

    我试图在UIWebViewiOS应用程序中使用jQueryMobile设置日期,值设置正确但最小和最大属性日期设置不起作用.和当我在模拟器上运行它时,当选择日期字段时,日期选择器可见,但未设置最小,最大日期.解决方法模拟器的safari不支持设置输入类型=“日期”的最小值和最大值.您可以通过导航到thissite并尝试控制来测试它.它(可能)可以在桌面浏览器上运行,但不会在模拟器的浏览器或UIWebView中运行.

  3. ios – 设置NSDataDetector的上下文日期

    假设今天是2014年1月20日.如果我使用NSDataDetector从“明天下午4点”字符串中提取日期,我将得到2014-01-21T16:00.大.但是,假设我希望NSDataDetector假装当前日期是2014年1月14日.这样,当我解析“明天下午4点”时,我将得到2014-01-15T16:00.如果我在设备上更改系统时间,我会得到我想要的.但是,有没有办法以编程方式指定它?

  4. ios – 如何自动生成日期属性为Date而不是NSDate的NSManagedObject子类?

    我目前正在将我的项目更新为Swift3,并且我将所有的NSDate方法和扩展都移动到Date以便在应用程序中保持标准.问题是我使用Xcode自动生成我的NSManagedobject子类,它生成日期属性为NSDate而不是Date.有没有办法用日期属性作为日期生成它?

  5. ios – 如何减去日期组件?

    今天是星期五,根据NSCalendar,这是6.我可以通过使用以下内容得到这个我怎么得到上周六的工作日组件,应该是7?

  6. ios – NSString cString已被弃用.什么是替代品?

    我有另一个新手问题.我写了一段代码,将Nsstring转换为NSMutableData,以模拟一个webService结果.但事实证明,cString已被弃用.你可以帮我更换吗?这是我的代码解决方法>从字符串获取原始字节.>获取UTF8编码中这些字节的长度.>使用dataWithBytes:length:方法创建NSData对象.

  7. iOS – 友好的NSDate格式

    我需要在我的应用程序中显示帖子的日期给用户,现在我用这种格式:“5月25日星期五”.如何格式化NSDate以阅读“2小时前”的内容?使其更加用户友好.解决方法NSDateFormatter不能做这样的事情;你将需要建立自己的规则.我想像:所以这是打印’x分钟前’或’x小时前’从日期起24小时,通常是一天.

  8. ios – NSDate得到上周,上个月的问题

    我需要从当前日期开始获得上一个礼拜.所以我找到了可以重新计算当前日期添加间隔的解决方案这个参数:[[NSDatedate]dateByAddingTimeInterval:-604800.0](前一周)[[NSDatedate]dateByAddingTimeInterval:-2629743.83](取得上个月)正如我想,为了让周,这种方法运行良好,没有任何问题,因为每周有七天,间隔没有改变.但

  9. ios – Swift 3 – 比较两个日期时使用&lt;运算符

    当比较两个日期时,我可以比较使用>但不是

  10. ios – 如何使用Unicode十六进制值(UTF-16)在Swift中表达字符串

    我想在Swift中使用十六进制值编写一个Unicode字符串.我已经阅读了字符串和字符的documentation,所以我知道我可以使用特殊的Unicode字符直接在字符串如下:版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部