结合这三个SQL查询

时间:2014-09-15 11:12:21

标签: 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

MOST LIKES (按降序排列;大多数人喜欢在顶部)

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 = paperback拥有最多的观看次数,但是,当确定文章的受欢迎程度时,观看权重比喜欢的要少。在表3中,ContentId = 2和format = paperback,比其他两篇文章中的任何一篇都有更多的喜欢(表中没有的文章根本没有喜欢)。然而,评论的权重最大,而在表2中,targetid = 1,format = ebook比其他两篇文章中的任何一篇都有更多的评论。

这意味着targetid = 1和format = ebook是最受欢迎的书。但是,当两个人的评论数量相同时,他们会依赖喜欢确定最受欢迎的文章。但是,如果他们再次拥有相同数量的喜欢,那么它会依赖于视图以确定最受欢迎的文章。

所需的输出是如下列表:

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

为了他们的受欢迎程度"。

2 个答案:

答案 0 :(得分:1)

我认为您可以使用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
)

答案 1 :(得分:1)

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

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;