【问题标题】:ORDER BY condition then the restORDER BY 条件,然后是其余的
【发布时间】:2017-10-09 19:17:03
【问题描述】:

为了获得models 表的趋势列表,我使用了一个查询,该查询将过去30 天内medias 表中model_id 的出现分组。

SELECT models.*,medias.model_id, COUNT(model_id) AS OCCURENCE
FROM medias
JOIN models ON models.id = medias.model_id
WHERE medias.date > DATE_SUB(CURDATE(), INTERVAL 30 DAY)
GROUP BY medias.model_id
ORDER BY OCCURENCE DESC
LIMIT '.$limit.' OFFSET '.$offset

但是,在这个查询中,我想找到一种方法来添加 models 表的其余部分,它会返回过去 30 天的趋势列表,然后是所有时间的趋势列表。

WHERE medias.date > DATE_SUB(CURDATE(), INTERVAL 30 DAY) ---> Then Infinite

【问题讨论】:

  • 你的最后一段对我来说没有任何意义。我不知道你想做什么。
  • 这是无效的标准 SQL - 您使用的是哪个 DBMS 产品?
  • 我使用 mySQL ...
  • 分组依据无效。不会在较新的 MySQL 版本上执行(除非在兼容模式下),可能会在较旧的 MySQL 版本上返回不可预测的结果。一般的 GROUP BY 规则说:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须要么标识一个分组列,要么是一个集合函数的参数!

标签: mysql sql join group-by


【解决方案1】:

我不完全理解您要达到的目标,但听起来您想在现有查询的基础上进行构建,该查询通过添加一组进一步的结果来按过去 30 天内的出现次数列出数据没有日期限制。

this SQLFiddle 中可以看到以下查询。小提琴使用任意数据集,因为您没有详细说明。

SELECT 
  models.*,medias.model_id, COUNT(model_id) AS occurance, 1 as orderfield
 FROM medias
  JOIN models ON models.id = medias.model_id
 WHERE medias.date > DATE_SUB(CURDATE(), INTERVAL 30 DAY)
 GROUP BY medias.model_id
UNION
SELECT
  models.*,medias.model_id, COUNT(model_id) AS occurance, 2 as orderfield
 FROM medias
  JOIN models ON models.id = medias.model_id
 GROUP BY medias.model_id
 ORDER BY orderfield, occurance DESC;

这将在您的原始查询之后使用如上所述的结果集。我在每个查询中都使用了一个标识符,以便可以首先使用“30 天”结果对它们进行排序,这只是一种快速而肮脏的方式来完成这项工作。

如果您希望第二组不包含第一组中的数据,您只需要在第二个查询中使用 where 子句:

WHERE medias.date <= DATE_SUB(CURDATE(), INTERVAL 30 DAY)

this fiddle所示。

显然,您必须将您的 php 值放回原处以限制/抵消结果 - 为了演示目的,我将它们排除在外。

如果这不是您想要达到的目标,您可能需要编辑您的问题以更具体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-17
    • 2014-10-03
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2014-06-19
    相关资源
    最近更新 更多