将这三个SQL查询组合在一起


Combining these three SQL Queries

我开发了这三个查询,如下所示,它们可以找到每篇文章中最多的视图、最多的评论和最多的点赞(文章由内容ID和格式定义)。我在目标ID下面签名!=ContentID和该格式!=TargetClass,但我把它们视为一回事。

我需要使用这三个查询来输出评论、点赞和浏览量最多的前三篇文章,按顺序排列。我在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=平装本,比其他两篇文章中的任何一篇都有更多的点赞(表中没有的一篇根本没有点赞)。然而,评论的权重最大,在表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;

我认为您可以使用unionunion all来完成此操作。也许以下是你想要的:

(SELECT TargetID as ContentId, TargetClass
 FROM Comments
 GROUP BY TargetID, TargetClass
 ORDER COUNT(*) DESC
 LIMIT 1
)
UNION ALL
(SELECT ContentID, Format
 FROM CONTENT
 GROUP BY ContentID, Format
 ORDER BY COUNT(*) DESC
 LIMIT 1
)
UNION ALL
(SELECT ContentID, Format
 FROM Likes
 GROUP BY ContentID, Format
 ORDER BY COUNT(*) DESC
 LIMIT 1
)