ORDER BY条件然后其余的

时间:2017-10-09 19:17:04

标签: mysql sql join group-by

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

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

1 个答案:

答案 0 :(得分:0)

我并不完全了解您要实现的目标,但听起来您希望在现有查询的基础上进行构建,该查询会在过去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值来限制/抵消结果 - 我把它们留给了演示目的。

如果这不是您要实现的目标,您可能需要将问题编辑为更具体。