iT邦幫忙

0

想請問該如何用PHP抓資料庫資料抓排名順位

顯示的資料表內容

$student=
"select  redo_date
,case when course2__redos.redo_time=1 then'上午' 
      when course2__redos.redo_time=2 then '下午' 
      else null END as redo_time
,case when course2__redos.redo_admission_state=1 then'路跑$s'
      when course2__redos.redo_admission_state=0 then '游泳$s'
      else null END as redo_admission_state
,case when course2__courses.c_place=null then'缺席' 
      else c_place END as c_place
         from course2__redos
         left join course2__choices
         on  course2__redos.redo_place = course2__choices.ch_id
         left join course2__courses
         on course2__choices.ch_c_id =  course2__courses.c_id 
         where redo_stuid='$redo_stuid' ";

https://ithelp.ithome.com.tw/upload/images/20200415/201250779kc6xnUgOs.jpg

目的是想讓$s抓取順序的數字,讓資料能顯示這筆資料是第幾筆資料.....
'路跑$s'和'游泳$s'能
EX:路跑1(路跑第一位)、路跑2(路跑第二位)、....、游泳1(游泳第一位)
php必須顯示出第一位申請 第二位申請等

算出照同一天(redo_date)(日期)
的同一時段(redo_time)(1=上午、2=下午)
同一類行申請的(redo_admission_state)(1=路跑、0=游泳)
第$s位
依redo_admission(申請時間)排出先後順序

想不通該怎樣能讓$s顯示順位....
應該說要怎麼在條件上同時指定三個欄位相同的資料......
如果只有一個欄位還好...三個不知道怎麼設定
設定完還的設定$s抓資料順位的排位數字...

看更多先前的討論...收起先前的討論...
player iT邦大師 1 級 ‧ 2020-04-15 21:53:29 檢舉
你資料是從SQL資料庫出來的
排序就直接加 order by 子句就好了
別要想在PHP裡再做排序
那樣很傷效能的
x31131211 iT邦新手 5 級 ‧ 2020-04-15 22:06:03 檢舉
應該說不是資料的排序.......而是要抓資料的順位.....
符合xx日xx時xx類(三種欄位)的第幾位申請的資料.........
(ex:這筆資料是 日期:2020-04-04 時段:下午 的游泳申請 是第三個申請的....)
php必須顯示是 第$s位申請,資料庫有排序但沒辦法顯示順位 (+上沒有權限去更動sql......)必須再php靠redo_admission(申請時間)排順位並讓$s抓取數字.....讓$s能顯示出是第幾位 orz
froce iT邦大師 1 級 ‧ 2020-04-16 08:35:34 檢舉
前端排序。
像這種多欄位的排序丟給前端做最省事。
>這筆資料是 日期:2020-04-04 時段:下午 的游泳申請 是第三個申請的
來自菜鳥的意見,有錯誤或表達不清楚再多包涵

用<?php
while($product_row = mysql_fetch_array($get_product_result)){ ?>
  <tr>
    <td><?php echo $product_row['redo_date']></td>  //日期
    <td>時段 :下午的游泳申請 </td>//這部分可能就抓取時範圍就限制在可能12:00~23:59:59然後哪一類
    <td>第<?php echo $i>個申請得</td
  </tr>
<?php
$i++; //取完一筆就會加一,就有順位了
} ?>
大致上是這樣,有錯誤輕噴XD
x31131211 iT邦新手 5 級 ‧ 2020-04-16 13:21:53 檢舉
不會...我自己都是菜鳥,昨天嘗試RANK IF ELSE 寫寫看但一直沒成功WWW
x31131211 iT邦新手 5 級 ‧ 2020-04-16 14:31:12 檢舉
想請問一下 為什麼大大會用那麼多<?php ?> 對這方面不是很懂w
>想請問一下 為什麼大大會用那麼多<?php ?> 對這方面不是很懂w
最近比較常在改表單,我是從手上的檔案隨便抓一段複製貼上修改的@~@

<?php
$s=1;

while($product_row = mysql_fetch_array($get_product_result)){
  
  echo '這筆資料是 日期:' , $product_row['redo_date'] , '時段 :下午的游泳申請 是第' , $s , '個申請的';
  $s++;

} ?>
這樣精簡過後可能比較好懂(?
x31131211 iT邦新手 5 級 ‧ 2020-04-16 16:33:13 檢舉
目前的理解是
$i=1;//設字串i=1
while($product_row = mysql_fetch_array($get_product_result)){
//當(字串product_row = 將$get_product_result儲存為php Array行式)  
  echo '這筆資料是 日期:' , $product_row['redo_date'] , '時段 :下午的游泳申請 是第' , $i , '個申請的';
//顯示'這筆資料是日期:' , 抓陣列product_row的redo_date元素,'時段 :下午的游泳申請 是第' , $i , '個申請的';
  $i++;//字串i遞增 1 2 3....至最後一筆
}
不知道有沒有錯.....
YES

1 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2020-04-16 16:33:28

Schema (MySQL v8.0)

CREATE TABLE redo_table
(
	redo_date VARCHAR(10),
	redo_time CHAR,
	redo_admission_state CHAR,
  	redo_admission VARCHAR(19)
);

INSERT INTO redo_table VALUES('2020-04-01','1','0','2020-04-01 02:00:00');
INSERT INTO redo_table VALUES('2020-04-01','1','0','2020-04-01 01:00:00');
INSERT INTO redo_table VALUES('2020-04-01','1','1','2020-04-01 03:00:00');
INSERT INTO redo_table VALUES('2020-04-01','1','1','2020-04-01 02:00:00');
INSERT INTO redo_table VALUES('2020-04-01','1','1','2020-04-01 01:00:00');
INSERT INTO redo_table VALUES('2020-04-02','1','0','2020-04-01 05:00:00');
INSERT INTO redo_table VALUES('2020-04-02','1','0','2020-04-01 04:00:00');
INSERT INTO redo_table VALUES('2020-04-02','1','0','2020-04-01 03:00:00');
INSERT INTO redo_table VALUES('2020-04-02','1','0','2020-04-01 02:00:00');
INSERT INTO redo_table VALUES('2020-04-02','1','0','2020-04-01 01:00:00');
INSERT INTO redo_table VALUES('2020-04-02','1','1','2020-04-01 06:00:00');
INSERT INTO redo_table VALUES('2020-04-02','1','1','2020-04-01 05:00:00');
INSERT INTO redo_table VALUES('2020-04-02','1','1','2020-04-01 04:00:00');
INSERT INTO redo_table VALUES('2020-04-02','1','1','2020-04-01 03:00:00');
INSERT INTO redo_table VALUES('2020-04-02','1','1','2020-04-01 02:00:00');
INSERT INTO redo_table VALUES('2020-04-02','1','1','2020-04-01 01:00:00');

Query #1

SELECT
	redo_date,
    redo_time,
    redo_admission_state,
    redo_admission,
    RANK() OVER (
      	PARTITION BY redo_date, redo_time, redo_admission_state
    	ORDER BY redo_admission
    ) therank
	from redo_table;
redo_date redo_time redo_admission_state redo_admission therank
2020-04-01 1 0 2020-04-01 01:00:00 1
2020-04-01 1 0 2020-04-01 02:00:00 2
2020-04-01 1 1 2020-04-01 01:00:00 1
2020-04-01 1 1 2020-04-01 02:00:00 2
2020-04-01 1 1 2020-04-01 03:00:00 3
2020-04-02 1 0 2020-04-01 01:00:00 1
2020-04-02 1 0 2020-04-01 02:00:00 2
2020-04-02 1 0 2020-04-01 03:00:00 3
2020-04-02 1 0 2020-04-01 04:00:00 4
2020-04-02 1 0 2020-04-01 05:00:00 5
2020-04-02 1 1 2020-04-01 01:00:00 1
2020-04-02 1 1 2020-04-01 02:00:00 2
2020-04-02 1 1 2020-04-01 03:00:00 3
2020-04-02 1 1 2020-04-01 04:00:00 4
2020-04-02 1 1 2020-04-01 05:00:00 5
2020-04-02 1 1 2020-04-01 06:00:00 6

另外說一下
這不叫排序(ORDER BY, 依考試分數由大排到小)
這叫排名(RANK BY, 依考試分數決定的名次)

x31131211 iT邦新手 5 級 ‧ 2020-04-16 23:21:47 檢舉

是用
PARTITION BY 進行欄位分組
將三個欄位相同的資料分為一組
ORDER BY 的欄位做每組資料的排位依據
然後再加RANK()OVER()的排序結果
放在therank這個新的欄位嗎???

的確抓的是資料的排名不是排序,謝謝指正
去試著用RANK()OVER()顯示看看

請問樓上的有試成功嗎??
同樣用PHP抓取MYSQL資料表做排名
但一直顯示文法錯誤

x31131211 iT邦新手 5 級 ‧ 2020-04-17 18:16:11 檢舉

還沒成功
/images/emoticon/emoticon06.gif
目前用的是MYSQL是5.7.25
RANK貌似要MYSQL8開始才有支援
(也有可能是我自己語法哪裡錯誤了)
所已目前還在嘗試中

我要發表回答

立即登入回答