iT邦幫忙

0

PHP 這樣要如何判斷搜尋

  • 分享至 

  • xImage

我的程度不好請大家見諒 , 我想從專案下手會比較有動力 , 這樣比較知道我欠缺什麼 , 之前從頭開始學 , 學到一半就沒動力了

以下是我的需求 , 及我的程式想法 , 這樣的需求程式可以做到嗎 ?
有約 1000 個資料表如下要做搜尋排序 , 首先我設定排序規則 , 然後啟動排序
afc 與 afc1 順序規則是 ABCDEFGHIJKLMNOP.....
time 順序規則是 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12....

以下是 mysql 資料表 , 我會將 excel 轉成 sql 資料表

https://ithelp.ithome.com.tw/upload/images/20180926/20104326W48Unxmm9m.png

要達成如下效果
https://ithelp.ithome.com.tw/upload/images/20180926/20104326029AxYs5o2.png

第一個先設定搜尋 afc 與 afc1 LIKE '%AB%' 資料及 time 6 如下

$sql_query="SELECT * FROM user WHERE afc LIKE '%AB%' AND afc1 LIKE '%AB%' AND time LIKE '%6%'";

搜尋到後刪除資料表 , 以免往後重覆搜尋

$sql ="DELETE FROM user WHERE time="6; 

afc1 搜尋到 AB 後 , 接下來下一個資料表 afc 欄位 , 要搜尋最靠近 AB 字母的是 AB 或是 CD 或是 EF , 時間則搜尋往上的最靠近的 7

我想到的判斷是用 SWITCH , 但這要先設定條件 $i=1 , 但我的條件很多 , 有 AB or CD or EF , 當符合才會取用 , 這樣要如何設定

<?php
$i='1';  // 要設定多個條件

switch ($i) {
  case 0:
    echo "變數是 0";
    break;
  case 1:
    echo "變數是 1";  //這裡要執行 SQL 搜尋語法 $sql_query="SELECT * FROM user WHERE afc LIKE '%AB%' AND afc1 LIKE '%AB%' AND time LIKE '%6%'"; 
    break;
  case 2:
    echo "變數是 2";
    break;
}
?>

afc1 搜尋到 AB 後 , 接下來下一個要搜尋最靠近 AB 字母的是 AB 或是 CD 成為 afc , 時間則搜尋往上的最靠近的 7

以下經由判斷式自行產生 , 往後都由判斷式自行產生 , 直到 1000 個資料搜尋完畢

$sql_query="SELECT * FROM user WHERE address LIKE '%AB%' AND address1 LIKE '%CD%' AND time LIKE '7%'";

最後完成的排序類似下面

https://ithelp.ithome.com.tw/upload/images/20180926/20104326UZnMG3xZq3.png


實際畫面類似這樣

https://ithelp.ithome.com.tw/upload/images/20180926/20104326FWQyXlkMp6.png

找了很多資料 , 想到下面這樣寫 , 當然是不對 , 想不出來還可以怎麼寫

$time6='06';$time7='07';$time8='08';$time9='09';
$be1='AB';$sh2='CD';$ne3='EF';$so4='GH';$zs5='IJ';

    if( $time6 < $time7 ) AND (afc LIKE $be1 or $sn2 or $ne3 or $so4) AND (afc1 LIKE $be1 or $sn2 or $ne3 or $so4){

   echo '$re=$sql_query("SELECT * FROM user "WHERE address LIKE $be1 AND address1 LIKE $be1 AND time LIKE $time6");

    }elseif ($time7 < $time8)AND (afc LIKE $be1 or $sn2 or $ne3 or $so4) AND (afc1 LIKE $be1 or $sn2 or $ne3 or $so4){

   echo ' $re=$sql_query("SELECT * FROM user "WHERE address LIKE $be1 AND address1 LIKE $be1 AND time LIKE $time7");

    }elseit ($time8 < $time9)AND (afc LIKE $be1 or $sn2 or $ne3 or $so4) AND (afc1 LIKE $be1 or $sn2 or $ne3 or $so4){

   echo ' $re=$sql_query("SELECT * FROM user "WHERE address LIKE $be1 AND address1 LIKE $be1 AND time LIKE $time8");

    }
看更多先前的討論...收起先前的討論...
wingkawa iT邦新手 3 級 ‧ 2018-09-26 13:55:18 檢舉
呃,你知道if else嗎?
還有,你知道怎麼用php連接資料庫,然後執行sql語句取得查詢結果嗎?
蟹老闆 iT邦大師 1 級 ‧ 2018-09-26 14:43:35 檢舉
這樣比較知道我欠缺什麼 <---能說說你已經知道你欠缺什麼了嗎?
froce iT邦大師 1 級 ‧ 2018-09-26 14:46:37 檢舉
你欠缺的是這行的基本...
不要再想專案了,先去拿DB和PHP的書惡補好你的基礎好嗎?
看到資料庫是搜尋到後把那行刪除來避免重複搜尋的...
我只想說,你打算拿sql做程式開發設計啊。
還是又想自創sql??

搜尋刪除是怎麼樣一個觀念??人家就只是「條件刪除」
啊搜尋刪除是什麼鬼啊。

你要學的真的不是怎麼寫程式了。
你欠缺的是看說明書。

你要知道,拿平版來當切菜板做切菜的動作,是一件很好笑的事。
重點是,這只有懂的人才會覺得好笑。不懂的人完全不知道笑點在哪。
搞不好還會覺得「很好切」

你可能不懂我上面說這些話的意思。但我相信一定有能懂我說的意思。你能搞嬞意思的話,你就可以出師了。
關鍵字 巢狀迴圈
某個人因為知道 KNOW HOW 所以他能月領四萬,應該是做到不想做了,所以A大想利用 PHP + MYSQL解決這個問題,用月收三萬五來接這個坑
接著就一系列的問題,希望可以把人家四萬一個月的KNOW HOW 湊出來,所以大家幫幫忙吧,看能不能把A大不了的KNOW HOW 湊出來
我這邊幫A大加油打氣
照順序把全部的資料丟進資料庫就好了壓,排序只是浪費效能
而且從EXCEL丟到資料庫,寫VBA會比較快
柯柯 iT邦新手 3 級 ‧ 2018-09-26 16:39:22 檢舉
所以我看不他的問題 是正常的嗎@@?

整篇文章看了3次 還是不懂他的問題是甚麼 QQ
還有搜尋到結果 為什麼要刪除資料庫的資料呢@@

如果是搜尋出來的資料要排序 怎不用 order by @@
wingkawa iT邦新手 3 級 ‧ 2018-09-26 17:07:30 檢舉
所以我第一個先問他知不知道if else跟查詢
最基本的會,基本上就只是組合出目標結果而已
跑得快 iT邦新手 3 級 ‧ 2018-09-26 17:51:11 檢舉
看不懂問題是神摸
alex9453 iT邦新手 2 級 ‧ 2018-09-26 18:17:29 檢舉
這裡無法貼圖 , 我又把 if else if 寫法寫上去 , 貼在最後分隔線下 , 請各位大大看看哪裡還需要修正的 , 感恩
alex9453 iT邦新手 2 級 ‧ 2018-09-26 18:28:40 檢舉
是搜尋到符合條件後列表出來後刪除 , 因為我怕重複搜尋到同樣資料表 , 一個資料表只能列表一次 , 還是有其他方法避免重複搜尋
wingkawa iT邦新手 3 級 ‧ 2018-09-26 22:31:42 檢舉
一般來說不會去刪除資料,你怕查到同一筆資料,你就要改變你的查詢條件。
辦法是人想出來的,寫程式就是不停去想那個更好的辦法,這沒有固定的正解,這要靠你自己去精煉那個規則。

慢慢想吧,你完全還沒進入使用資料庫的狀況。
也沒有進入寫程式的狀況。

雖說看起來你應該算是沒天分的那邊,但有心學就繼續學吧,希望你學得越多,當你能
漸漸減少這種大哉問的次數
減少這種看不懂你在問什麼的問題時,
那才是真的有進步。
加油吧。
1.SQL語法錯誤
2.like 使用方式錯誤(問Google大神)
3.SQL本身就可以排序(請參照Order By)
alex9453 iT邦新手 2 級 ‧ 2018-09-27 09:15:11 檢舉
謝謝大大們的提示 , 我只會下面簡單的判斷 , 書上也只教這樣 , 複雜的判斷 , 還是要經驗累積

int score = 88;
char level;
if(score >= 90) {
level = 'A';
}
else if(score >= 80 && score < 90) {
level = 'B';
}
else if(score >= 70 && score < 80) {
level = 'C';
}
else if(score >= 60 && score < 70) {
level = 'D';
}
else {
level = 'E';
}
System.out.printf("得分等級:%c%n", level);
}
增廣建文 iT邦研究生 5 級 ‧ 2018-09-27 14:02:47 檢舉
1. "有約 1000 個資料表"是指1000張table還是有1000row的資料阿?
如果是1000張table假設這方法可行會很慘
2. 排序用order by就可以
多個col分開排序可以參考
ORDER BY time DESC, afc DESC, afc1 DESC
alex9453 iT邦新手 2 級 ‧ 2018-09-27 14:39:35 檢舉
是 1000row
alex9453 iT邦新手 2 級 ‧ 2018-09-27 15:03:37 檢舉
time 用 order by 可以,但afc. afc1. 要按照我設定的優先順序排序,就像我設的變數那樣,$be1,$sh2 ...... ,排序有多種可能,不只是由大到小或由小到大,這樣就無法做到了
連order都不知道怎麼用。排序還有多種可能。我的天啊,這是什麼邏輯。
那你就將什麼時候該由小到大,什麼時候該由大到小的規則也寫進去不就行了。

不要不會用就以為這辦不到。重點是你先搞清楚你要的是什麼。你連要什麼都說的不清不楚,就只會說「無法做到」

誰說無法做到的。
alex9453 iT邦新手 2 級 ‧ 2018-09-27 16:32:15 檢舉
了解,字串要如何比大小,還不太會,看的書上都是數字比大小,沒遇過用字串來比
跑得快 iT邦新手 3 級 ‧ 2018-09-27 16:59:27 檢舉
自己設權重後order by
alex9453 iT邦新手 2 級 ‧ 2018-09-27 23:45:42 檢舉
上面大大我講的不夠清楚 , 感覺 order by不是我要的 , 我用中文表格解釋應該會比較清楚 , 我貼圖在下面的鄉民回答欄位 , 因為上圖貼太多 , 會太複雜 , 各位如果有空再幫我看看 . 先謝謝了
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0

最大的問題在於沒有花足夠的時間在個別的知識,以你這問題來說,首先不需要考慮php的部份,
只用SQL處理時,是否能達到你的需求,只有在SQL沒問題的時候,再確定php的邏輯是否正確,
最終才是與php銜接的部份,不要想把所有問題綁在一起解決,先把問題細化,再來詢問吧,
不花心力在基礎上,是新手最大的毛病,如果這點都不做,不管過多久都還是只會在原地打轉

看更多先前的回應...收起先前的回應...
alex9453 iT邦新手 2 級 ‧ 2018-09-27 23:42:26 檢舉

謝謝你的回答 , 上面有人給我建議 , 但感覺不是我要的 , 原始貼圖太多 , 所以我貼在這比較清楚 , 你如果有空也幫我看看 , 謝謝 !
上面大大我講的不夠清楚 , 感覺 order by不是我要的 , 我用中文表格解釋應該會比較清楚

未排序前
https://ithelp.ithome.com.tw/upload/images/20180928/20104326L5vc0CX6CM.png

A .以下以時間及水果為排序重點 , 先找符合的時間 TIME 再找水果 AFC與 AFC1
時間順位為 12345678

B . 時間為 : [1].0613 [2].0725 [3]. 0734 [4].0824 [5].0925 [6].0945 [7].1034 [8].1045
水果順位為 1234567812345678
C .水果為 : [1].蘋果 [2].荔枝 [3].葡萄 [4].鳳梨 [5].西瓜 [6].龍眼 [7].榴槤 [8].香蕉

排序方法如下 , 先找符合 TIME 再找 AFC 與 AFC1

1 . 最早0613有兩個 , 但 AFC 蘋果是第一順位 , 所以取上面第2列 , 成為排序好下面的第19列

2 . 而排序後的第19列的 AFC1 為蘋果 , 所以找蘋果的第一順位是蘋果自己本身或荔枝及葡萄 , 而時間 0725 有兩個 , 只有上圖第6列符合是蘋果 , 所以取上圖第6列為下圖第20列

3 . 下圖第20列 0725 的 AFC1是鳳梨 , 鳳梨的第一順位是鳳梨自己, 但上圖 AFC 沒有鳳梨 , 所以找下一位是西瓜 , 上圖 0824 有兩位取 AFC 有西瓜的第4列成為下面的 21 列

4 . 下面的 21 的 AFC1 葡萄的第一順位是葡萄自己 ,但上圖 AFC 沒有葡萄,所以找下一位是鳳梨 , 取上面 0945 的 AFC 鳳梨為下面第22列

5 . 下面22列AFC1為香蕉 , 香蕉下一位是蘋果 , 取1045 的 AFC 為蘋果成為下面第 23 列這樣就完成了

排序後

https://ithelp.ithome.com.tw/upload/images/20180928/20104326TXGTmHjyti.png

wingkawa iT邦新手 3 級 ‧ 2018-09-28 12:07:19 檢舉

alex9453 這樣子問題就清楚、有條理多了,我有空的時候會幫你想想看。
暫時看下來有個小問題:
像是0613的第二個0613/吃鳳梨很養生/想吃西瓜好久了
排序後就消失了,這代表每個TIME都只需要出現一次囉?

alex9453 iT邦新手 2 級 ‧ 2018-09-28 12:36:54 檢舉

對,只能出現一次

alex9453 iT邦新手 2 級 ‧ 2018-09-28 14:08:22 檢舉

按錯了

alex9453 iT邦新手 2 級 ‧ 2018-09-28 15:36:29 檢舉

有1000row每10row排序成一張A4,所以會排成100張A4,所以每1row只能出現一次

alex9453 iT邦新手 2 級 ‧ 2018-09-29 12:05:56 檢舉

下面這樣可以找出要的資料 , 但是 time 就要手動輸入 , 好像無法自動判斷時間大小 , 找出一行後 , 而且要自動一行加一行到10行成為一張 A4 , 是否有那裏可以在加強的呢 ?

SELECT * FROM user WHERE time LIKE '%6%' AND afc LIKE '%蘋果%' OR (afc1 LIKE '%蘋果%' AND afc1 LIKE '%荔枝%' AND afc1 LIKE '%葡萄%' AND afc1 LIKE '%鳳梨%')

0
炎之虛空
iT邦高手 3 級 ‧ 2018-09-28 09:29:57
SELECT * 
FROM Table1 
WHERE id NOT IN (
	SELECT Table1.id 
	FROM Table1 
	JOIN Table1 as Table2 ON Table2.afc1 = Table1.afc 
)
ORDER BY time ASC, afc DESC
看更多先前的回應...收起先前的回應...
alex9453 iT邦新手 2 級 ‧ 2018-09-28 14:09:08 檢舉

這個沒有納入 , 水果及時間的考慮因素

最多給你的是大致上範例
剩下請自己發揮

alex9453 iT邦新手 2 級 ‧ 2018-09-28 15:36:54 檢舉

多謝

alex9453 iT邦新手 2 級 ‧ 2018-09-29 12:07:04 檢舉

下面這樣可以找出要的資料 , 但是 time 就要手動輸入 , 好像無法自動判斷時間大小 , 找出一行後 , 而且要自動一行加一行到10行成為一張 A4 , 是否有那裏可以在加強的呢 ?
SELECT * FROM user WHERE time LIKE '%6%' AND afc LIKE '%蘋果%' OR (afc1 LIKE '%蘋果%' AND afc1 LIKE '%荔枝%' AND afc1 LIKE '%葡萄%' AND afc1 LIKE '%鳳梨%')

要加強是你的基本功......

我要發表回答

立即登入回答