[英]ORDER BY condition then the rest
為了獲得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 中工作。 小提琴使用任意數據集,因為您沒有詳細說明。
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 值放回以限制/抵消結果 - 為了演示目的,我將它們排除在外。
如果這不是您想要實現的目標,您可能需要編輯您的問題以使其更具體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.