iT邦幫忙

0

根據數據的某一個值做每周排序?

有十筆資料
根據 views(int) 這個欄位做排序
一般的排序就只要 ORDER BY views DESC 就行
views 會根據某些事件加加減減形成數字

但如果要做到這樣:
每月有四周
第一周的所有資料的 views 跟往後第二 三周.....每一周都會有變化
資料庫要怎麼記憶說
當第一周結束時,來到第二周時,上周的 views 資料會重設(或是記錄在某處)所以第二周又會是新的排序?

跪求大神給個思路,萬分感謝~~

看更多先前的討論...收起先前的討論...
你把原始資料,包含欄位定義, 還有想得到的排序方式, 補充上來.這樣比較具體.參考一下其他問資料庫的問題.
fillano iT邦超人 1 級 ‧ 2019-07-26 09:52:53 檢舉
建多個view,根據日期來判斷要查詢哪個。
slime iT邦大師 1 級 ‧ 2019-07-26 11:00:07 檢舉
先依需求拆解邏輯, 例如:
"上週銷售量與上上週比較"

則步驟包括:
1. 先定義每週是"週一到週日"或"週日到週六"
2. 執行日換算出"本週"的"起始日"與"結束日"
3. 把"本週"的"起始日"與"結束日", 推算出"上週"與"上上週"的"起始日"與"結束日"
4. 撈取銷售資料, 依"上週"與"上上週"的"起始日"與"結束日"統計.
5. 呈現結果.
小松菜奈 iT邦研究生 4 級 ‧ 2019-07-26 11:20:34 檢舉
fillano 也就是說PHP要判斷今天日期,根據範圍顯示

2 個回答

0
浩瀚星空
iT邦大師 1 級 ‧ 2019-07-26 09:51:54

給你最單純的思路好了。
「歷史記錄」

1.我不會用第1 2 3 4週。而是會用每年度的第幾周(0~52)。做為週期依據
2.由於排序依據過了就不會再有變動性,認真來說。直接記錄其排序資料也就行了。

看更多先前的回應...收起先前的回應...
小松菜奈 iT邦研究生 4 級 ‧ 2019-07-26 11:21:16 檢舉

也就是說會有一個資料表關連式的紀錄,再用PHP根據日期範圍抓時間顯示

看好,我正在教你新的東西。
就是「每年度的第幾周(0~52)」
有這個就不需要日期範圍了。不懂這是啥鬼的話。再問吧。

小松菜奈 iT邦研究生 4 級 ‧ 2019-07-26 13:57:14 檢舉

好像懂了
想辦法找出如何判斷今天是第幾週
紀錄的時候也是丟這個數字進去(取代日期)
再根據今天是第幾週顯示紀錄的東西

你真要用週數去取代日期喔.都已經把 week(idate) 這樣範例給你看了.

一級屠豬士

其實我沒注意到你寫的sql已經有我說的週數了。
我就是想要教他用week沒錯。

還要判斷年,不然不同年的,相同週,放一起排序,就亂了.存日期,使用函數取,這是基本的啊.這個都是不學基本的函數,然後就是迴圈加if,土法煉鋼...

所以才會說「每年度的第幾周」
我話沒講的很白。就是要讓他自已去思考的。

我自已用的是 from_unxitime 這個函數。是用
from_unxitime(time,'%Y%u')的方式處理的。(因為我資料庫沒在用date time的欄位類別,存的都是unixtime值。

不過我們說是這樣說,不知道他是否能明白你跟我的說法跟東西就是了。這才是重點的。

我們都是希望他們能思考,但是蠻多都是不再仔細思考,就一招一路打下去.

3
一級屠豬士
iT邦高手 1 級 ‧ 2019-07-26 12:34:13
create table ithelp190726 (
  id int unsigned not null auto_increment primary key
, idate date not null
, val int unsigned not null
);

insert into ithelp190726 (idate, val)
select adddate('2019-01-01', @num := @num + 1)
     , round(rand() * 100)
  from performance_schema.GLOBAL_STATUS a
     , (select @num := 0) b
 limit 10;
 
insert into ithelp190726 (idate, val)
select adddate('2020-01-01', @xnum := @xnum + 1)
     , round(rand() * 100)
  from performance_schema.GLOBAL_STATUS c
     , (select @xnum := 0) d
 limit 10;
 
select *
     , YEAR(idate)
     , WEEK(idate)
     , rank() over (partition by YEAR(idate), WEEK(idate) order by val desc) as rnk
  from ithelp190726;
+----+------------+-----+-------------+-------------+-----+
| id | idate      | val | YEAR(idate) | WEEK(idate) | rnk |
+----+------------+-----+-------------+-------------+-----+
|  4 | 2019-01-05 |  86 |        2019 |           0 |   1 |
|  1 | 2019-01-02 |  64 |        2019 |           0 |   2 |
|  2 | 2019-01-03 |  47 |        2019 |           0 |   3 |
|  3 | 2019-01-04 |  46 |        2019 |           0 |   4 |
|  6 | 2019-01-07 | 100 |        2019 |           1 |   1 |
| 10 | 2019-01-11 |  97 |        2019 |           1 |   2 |
|  5 | 2019-01-06 |  91 |        2019 |           1 |   3 |
|  9 | 2019-01-10 |  55 |        2019 |           1 |   4 |
|  8 | 2019-01-09 |  26 |        2019 |           1 |   5 |
|  7 | 2019-01-08 |  25 |        2019 |           1 |   6 |
| 16 | 2020-01-02 |  22 |        2020 |           0 |   1 |
| 17 | 2020-01-03 |  16 |        2020 |           0 |   2 |
| 18 | 2020-01-04 |  16 |        2020 |           0 |   2 |
| 22 | 2020-01-08 |  88 |        2020 |           1 |   1 |
| 23 | 2020-01-09 |  85 |        2020 |           1 |   2 |
| 24 | 2020-01-10 |  59 |        2020 |           1 |   3 |
| 25 | 2020-01-11 |  43 |        2020 |           1 |   4 |
| 19 | 2020-01-05 |  30 |        2020 |           1 |   5 |
| 21 | 2020-01-07 |  19 |        2020 |           1 |   6 |
| 20 | 2020-01-06 |   2 |        2020 |           1 |   7 |
+----+------------+-----+-------------+-------------+-----+
20 rows in set (0.00 sec)

我要發表回答

立即登入回答