【问题标题】:Ordering by two columns not working按两列排序不起作用
【发布时间】:2016-09-30 19:33:18
【问题描述】:

我正在尝试创建一个显示前 10 篇文章的“趋势”列表。趋势列表基于最新和大多数视图。这是我当前的 SQL 查询的样子:

$resultSet = $db->query("SELECT * FROM Articles ORDER BY Counter DESC, dateStamp LIMIT 10");

Counter 是存储每篇文章有多少浏览量的列。 dateStamp 是存储每篇文章的日期时间的日期时间列。我当前的 SQL 适用于视图数量。它将查看次数最多的文章排在顶部,将查看次数最少的文章排在底部。

我在使用当前 SQL 时遇到的唯一问题是它不仅仅采用最近的日期。它查找所有日期并仅根据视图对查询进行排序。一篇文章可能长达 2 年,但它会有更多的浏览量,所以它会出现在趋势列表中。

我怎样才能使查询根据最近和大多数视图对结果进行排序?

示例数据:

日期:2015 年 8 月 1 日观看次数:20,000

日期:2016 年 9 月 30 日观看次数:500

日期:2016 年 9 月 28 日观看次数:400

日期:2016 年 9 月 25 日观看次数:150

日期:2016 年 9 月 22 日观看次数:100

日期:2016 年 9 月 21 日观看次数:98

日期:2016 年 9 月 20 日观看次数:92

日期:2016 年 9 月 18 日观看次数:10

日期:2016 年 9 月 15 日浏览次数:5

日期:2016 年 9 月 12 日观看次数:3

从技术上讲,数据应如下所示:

日期:2016 年 9 月 30 日观看次数:500

日期:2016 年 9 月 28 日观看次数:400

日期:2016 年 9 月 25 日观看次数:150

日期:2016 年 9 月 22 日观看次数:100

日期:2016 年 9 月 21 日观看次数:98

日期:2016 年 9 月 20 日观看次数:92

日期:2016 年 9 月 18 日观看次数:10

日期:2016 年 9 月 15 日浏览次数:5

日期:2016 年 9 月 12 日观看次数:3

日期:2016 年 9 月 11 日观看次数:2

它没有组织最近的日期。我需要它来组织最近的日期和最多的视图。视图部分工作正常,只是日期不正常。

【问题讨论】:

  • 提供样本数据和期望的结果。如果您要求我们以“合理”的方式对结果进行排序,那么您的问题应该以基于意见的方式结束。
  • 您的选择是:大多数视图受合理时间段的限制,最近的视图受合理次数的限制,具有合理的视图权重和时间段的最大权重函数。
  • @GordonLinoff 我已经更新了问题,请检查
  • 但是前 10 名最近的日期不一定与前 10 名观看次数最多的日期一致。两者完全没有关系。你还没有很好地考虑到你想要什么。
  • @MikeNakis 我想要根据他们拥有的观看次数排序最近的日期。

标签: mysql sql


【解决方案1】:

这是获取最近 10 条记录的方法:

SELECT * FROM Articles ORDER BY dateStamp DESC LIMIT 10;

这是按视图降序排列的方法:

SELECT ... ORDER BY Counter DESC;

两者结合:

SELECT *
FROM (SELECT * FROM Articles ORDER BY dateStamp DESC LIMIT 10) TOP10
ORDER BY Counter DESC;

【讨论】:

  • 由于某种原因,这不会打印出任何结果
  • @user2896120 这应该可以。你能用示例数据制作一个 sqlfiddle 吗?
  • 这是我的查询语句:$resultSet = $cn->query("SELECT * FROM (Articles ORDER BY dateStamp DESC LIMIT 10) ORDER BY Counter DESC"); 没有结果显示所以没有样本数据
  • 这和我写的不一样。你错过了第二个SELECT * FROM
  • @user2896120 我的意思是样本 input 数据,所以我们可以尝试查询,看看它是否有效。您的查询有语法错误,因此您在执行查询时似乎没有检查错误,否则您会看到错误。
【解决方案2】:

我认为您需要使用where 来限制显示的日期。 order by 根据第一列对结果进行排序。如果两行第一列的值相同,它只使用第二列。

【讨论】:

  • WHERE 可用于将其限制在特定日期范围内,但如何使用它来获取最近的 10 行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多