php - 组合这三个 SQL 查询

标签 php mysql sql

我开发了这三个查询,如下所示,可查找每篇文章的最多浏览量、最多评论和最多点赞数(文章由内容 ID 和格式定义)。我理解 Target ID != ContentID 和 Format != TargetClass,但我将它们视为同一事物。

我需要使用这三个查询来输出拥有最多评论、点赞和浏览量的前 3 篇文章(按该顺序的优先级)。我在 SQL 方面并不是特别有天赋,所以有人可以提供一个解决方案和一个温和的解释吗?如果问题需要重新表述,请说清楚,我会这样做。干杯。

最多观看次数(按降序排列;最多观看次数位于顶部)

SELECT ContentID, Format
FROM Content
GROUP BY ContentID, Format
ORDER BY COUNT(View) DESC

最多评论(按降序排列;最多评论位于顶部)

SELECT TargetID, TargetClass
FROM Comments
GROUP BY TargetID, TargetClass
ORDER BY COUNT(TargetID) DESC

最喜欢(按降序排列;最多喜欢位于顶部)

SELECT ContentID, Format
FROM Likes
GROUP BY ContentID, Format
ORDER BY COUNT(ContentID) DESC

示例数据和输出(根据要求) 表 1:

ContentID| Format  |View|
---------|---------|----|
    1    |Paperback|1700|
---------|---------|----|
    1    |  Ebook  |1500|
---------|---------|----|
    2    |Paperback|1500|
-------------------------

表 2:

CommentID|TargetID |TargetClass|
---------|---------|-----------|
    1    |    1    |   Ebook   |
---------|---------|-----------|
    2    |    2    | Paperback |
---------|---------|-----------|
    3    |    1    |   Ebook   |
--------------------------------

表 3:

  LikeID | ContentID| Format  |
---------|---------|---------|
    1    |    1    |Ebook    |
---------|---------|---------|
    2    |    2    |Paperback|
---------|---------|---------|
    3    |    2    |Paperback|
------------------------------

所需的解决方案:

在表 1 中,contentId = 1 且 format = 平装本的浏览次数最多,但是,在决定文章的受欢迎程度时,浏览次数的权重小于点赞数。在表 3 中,ContentId=2 且 format=paperback 比其他两篇文章中的任何一篇都有更多的喜欢(表中缺少的文章根本没有喜欢)。然而,评论的权重最高,在表 2 中,targetid=1、format=ebook 的评论比其他两篇文章中的任何一篇都多。

这意味着 targetid=1 和 format=ebook 是最受欢迎的书籍。然而,当两个人的评论数量相同时,他们就会依靠点赞来确定最受欢迎的文章。然而,如果他们再次拥有相同的点赞数,那么就会依靠浏览量来确定最受欢迎的文章。

所需的输出是如下列表:

ContentID | Format
1         | ebook
2         | paperback
1         | paperback

按照“受欢迎程度”排序。

最佳答案

我认为这是正确的解决方案:

SELECT V1.ContentID, V1.Format
FROM 
        ((SELECT ContentID, Format ,Sum(View) AS CountView
        FROM Content
        GROUP BY ContentID, Format) V1) LEFT OUTER JOIN 

        (
          SELECT V2.ContentID, V2.Format ,CountComments,CountLikes
          FROM
          ((SELECT TargetID AS ContentID, TargetClass AS Format,Count(TargetID) AS CountComments
          FROM Comments
          GROUP BY TargetID, TargetClass) V2) LEFT OUTER JOIN 

          ((SELECT ContentID, Format ,Count(ContentID) AS CountLikes
          FROM Likes
          GROUP BY ContentID, Format) V3)

          ON(V3.ContentID=V2.ContentID AND V3.Format =V2.Format)
        ) V12
        ON(V1.ContentID=V12.ContentID AND V1.Format =V12.Format)
ORDER BY CountComments DESC,CountLikes DESC ,CountView DESC
LIMIT 3;

关于php - 组合这三个 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25846746/

相关文章:

mysql - 如何在mysql中查找 friend 的 friend

mysql - 包含日期函数的嵌套 MySQL 案例

javascript - 我无法选择搜索项目

php - Laravel 5.3 - htmlspecialchars() 期望参数 1 为字符串

mysql - 将 CONCAT 与 CASE 语句一起使用无法正常工作

sql - sqlite db的二维选择查询

sql - Oracle 转换错误时默认为 null - 时间戳

php 复杂关联数组与 $_POST 匹配

PHP MySQL : possible to check if a link is open?

MySQL - 基于不同列 A 值的平均列 B 值