ORDER BY条件,然后是其余条件



为了获得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

我不完全理解您想要实现的目标,但听起来您希望在现有查询的基础上,通过添加一组不受日期限制的结果,按过去30天内的发生次数列出数据。

可以看到以下查询在这个SQLFiddle中工作。fiddle使用了一个任意的数据集,因为您没有详细说明。

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)

如小提琴所示。

显然,您必须将php值放回以限制/偏移结果——出于演示目的,我省略了它们。

如果这不是你想要实现的,你可能需要编辑你的问题,使其更加具体。

最新更新