簡體   English   中英

ORDER BY 條件然后剩下的

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM