iT邦幫忙

0

SQL 如何搜尋到想要的資料

  • 分享至 

  • xImage

還未排序的 table , 會有約 1000 row , 下面只有寫幾條測試看看 , 未來 1000 row 是否可行
https://ithelp.ithome.com.tw/upload/images/20180930/20104326dthiIhw6IL.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 蘋果是第一順位 , AFC1 [2]是蘋果第二順位 , 應該是取到 id 001 才對 , AFC蘋果  AFC1荔枝 沒有這個 row , 但 AFC 蘋果  AFC 蘋果有這個 row , 程式如下
"SELECT *,MIN(time)FROM `fruit` WHERE time LIKE '0%' AND afc LIKE '%蘋果%' AND afc1 LIKE '%荔枝%' AND afc1 '%蘋果%'";

但出現錯誤如下

Notice: Trying to get property 'num_rows' of non-object in D:\xampp\htdocs\fruit\data1.php on line 9

Fatal error: Uncaught Error: Call to a member function fetch_assoc() on boolean in D:\xampp\htdocs\fruit\data1.php:31 Stack trace: #0 {main} thrown in D:\xampp\htdocs\fruit\data1.php on line 31

但我希望是取到當 TIME 是最低 , afc '%蘋果%' 與 afc1 '%荔枝%'但原始 row 沒有 , 所以要取 afc '%蘋果%' 與 afc1 '%蘋果%'這才有 , 也就是 id 1 , 一個蘋果一個蘋果時才會顯示 , 這要如何做呢 ?

程式改成這樣 , 就沒搜尋到資料

$sql_query = "SELECT *,MIN(time)FROM `fruit` WHERE time LIKE '0%' AND afc LIKE '%蘋果%' AND afc1 LIKE '%荔枝%' AND afc1 LIKE '%蘋果%'";

https://ithelp.ithome.com.tw/upload/images/20180930/20104326nYlnKLrnXV.png

看更多先前的討論...收起先前的討論...
你在哪裡的SQL教材中看到`=OR`?
alex9453 iT邦新手 2 級 ‧ 2018-09-30 12:38:46 檢舉
找不到可以用的 , =OR自己想的 , 別的有用 === 可以找出兩個資料相符合的 , 但不知怎麼用
你初學最好的方法是,一個條件一個條件慢慢加上去,再來檢視是不是符合預期。
先看
SELECT *,MIN(time)FROM `fruit`
再加上WHERE
SELECT *,MIN(time)FROM `fruit` WHERE time LIKE '0%'
再來加上AND
SELECT *,MIN(time)FROM `fruit` WHERE time LIKE '0%' AND afc LIKE '%蘋果%'
再來...
alex9453 iT邦新手 2 級 ‧ 2018-09-30 13:17:47 檢舉
謝謝回答 , 上面沒講清楚抱歉 , 我又重新修改了原圖 , 也就是希望 afc1 LIKE '%x荔枝%' AND afc1 LIKE '%x蘋果%' AND afc1 LIKE '%x葡萄%' , 先第一個找 荔枝 , 如果沒有再來找第二個 蘋果, 還沒有再找第三個 葡萄 , 我試過加 AND 或 OR 都不行 , 不知還能加什麼
你修改之後
『"SELECT *,MIN(time)FROM `fruit` WHERE time LIKE '0%' AND afc LIKE '%蘋果%' AND afc1 LIKE '%荔枝%' AND afc1 '%蘋果%'";』
最後一個條件少了一個LIKE
所以應該寫成
『"SELECT *,MIN(time)FROM `fruit` WHERE time LIKE '0%' AND afc LIKE '%蘋果%' AND afc1 LIKE '%荔枝%' AND afc1 LIKE '%蘋果%'";』
這樣會選出怎麼樣的afc1呢?
alex9453 iT邦新手 2 級 ‧ 2018-09-30 20:08:52 檢舉
沒錯誤訊息 , 但也沒搜尋到資料 , 這裡無法貼圖 , 我貼在上面 , 你可以回答在可以選標準答案的地方嗎 ? 那理才可以貼圖
那是因為沒有符合條件的record。
有哪一筆紀錄的afc1欄位,其內容有荔枝又有蘋果?
alex9453 iT邦新手 2 級 ‧ 2018-09-30 21:06:58 檢舉
pcw 感謝回答 , 我的意思是 , 先第一個找 荔枝 , 如果沒有再來找第二個 蘋果, 還沒有再找第三個 葡萄我是想要沒有荔枝時就取蘋果 , 這樣應該如何寫呢 ? 我有看下面 CASE , 也有改過 , 但無法執行 , 是我不會改才錯 , 不知道怎麼改才可以
SELECT CASE ("欄位名")
WHEN "條件1" THEN "結果1"
WHEN "條件2" THEN "結果2"
...
[ELSE "結果N"]
END
FROM "表格名";
為何不是找荔枝或蘋果或葡萄呢?
alex9453 iT邦新手 2 級 ‧ 2018-09-30 23:05:03 檢舉
不太懂你的意思 , 我設定的順序是這樣 , [1].荔枝 [2].蘋果 [3].葡萄 [4].鳳梨 [5].西瓜 [6].龍眼 [7].榴槤 [8].香蕉 , 會有 8 種可能 , 所以才會要設 afc1 有很多選項可選 , 因為會有 1000 row , 所以很多水果都會有
你要的不就是:
afc1 = 荔枝 or afc1 = 蘋果 or afc1 = 葡萄
嗎?
alex9453 iT邦新手 2 級 ‧ 2018-10-01 00:25:52 檢舉
$sql_query="SELECT *,MIN(time)FROM `fruit` WHERE time LIKE '0%' AND afc LIKE '%蘋果%' AND afc1 LIKE '%荔枝%' OR afc1 LIKE '%芭樂%' OR afc1 LIKE '%西瓜%'";

這樣應該找到 , afc 蘋果 afc1 西瓜 , 因為 afc1 荔枝 afc1 芭樂都沒有 , 可是卻找到 afc 荔枝 afc1 西瓜 , 這裡無法貼圖
alex9453 iT邦新手 2 級 ‧ 2018-10-01 00:29:39 檢舉
上面多打 LIKE , 下面修正 , 可是搜尋無資料
$sql_query="SELECT *,MIN(time)FROM `fruit` WHERE time LIKE '0%' AND afc LIKE '%蘋果%' AND afc1='%荔枝%' OR afc1='%芭樂%' OR afc1='%西瓜%'";
舉一隅不以三隅反,言盡於此了。
alex9453 iT邦新手 2 級 ‧ 2018-10-01 09:39:51 檢舉
pcw 感謝回答
and = 和,也就是包含全有的條件都要為真
or = 或,也就是其包含的條件有一項是真的就行。
至少這樣的基本要先知道。

再來就是運算式,一般就是 「=」 「>」「<」「!」「 like」(包含)「is」(真偽)「in」(符合其一)跟範圍式(between)的寫法。

你多少也先了解這些基本的東西吧,不要只會抄抄抄。而不去了解這些語法是幹什麼用的。

是你要配合現成的語法去達到你想要做到的事,而不是語法要配合你那種天馬行空的做法。

你想做的東西,其實還是做到到,但不是你可以理解的方式。
我就提示一點就好。你少做了一個希望排序的表出來。所以無從依據處理。
光 MIN(time) 就是問題了,樓主真的建議有系統地去把 SQL 語法學好
文字如何抓最大跟最小 ???? 你要抓,你要先用函數轉換後才行
不然就是用 ORDER BY 1 去抓第一筆資料,這些都只是基本的SQL SELECT 而已
如果對方用的是 NOSQL 咧,你是不是又要把 NOSQL 轉到 SQL 在弄一次
alex9453 iT邦新手 2 級 ‧ 2018-10-02 23:12:33 檢舉
改成這樣可以了 , $sql_query="SELECT *,MIN(time) FROM `fruit` WHERE time LIKE '0%' AND(afc LIKE '%芭樂%')AND (afc1 LIKE '%蘋果%' OR afc1 LIKE '%葡萄%' OR afc1 LIKE '%龍眼%')";
alex9453 iT邦新手 2 級 ‧ 2018-10-02 23:22:08 檢舉
但是當取到 afc1 值後 , 要再成為下一 row 的 afc , 這樣就可以一直排下去 , 到所有 row 完成 , 還要再研究看看
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
gn00044255
iT邦新手 5 級 ‧ 2018-10-01 13:37:56

觀念錯了
應該下 Select * From fruit
Order by time,(Case When afc Like '%荔枝%' then 1
When afc Like '%蘋果%' then 2
When ...... End),
(Case When afc1 Like '%荔枝%' then 1
When afc1 Like '%蘋果%' then 2
When ...... End)

alex9453 iT邦新手 2 級 ‧ 2018-10-01 22:48:46 檢舉

謝謝你這麼熱心回答 , 我改成這樣 , afc 只需要一個條件就可

$sql_query="Select * From fruit Order by time,(Case When afc Like '%荔枝%' then 1 End),(Case When afc1 Like '%荔枝%' then 1 When afc1 Like '%蘋果%' then 2 When afc1 Like '%葡萄%' End"; 

我的程度只看得懂簡單範例如下 , 應用到我的例子 , 就會有問題

SELECT Store_Name, Sales, Txn_Date 
FROM Store_Information 
ORDER BY 2 DESC;
SELECT Store_Name, CASE Store_Name
  WHEN 'Los Angeles' THEN Sales * 2
  WHEN 'San Diego' THEN Sales * 1.5
  ELSE Sales
  END
"New Sales",
Txn_Date
FROM Store_Information;
alex9453 iT邦新手 2 級 ‧ 2018-10-02 23:13:26 檢舉

謝謝 ! 改成這樣可以了

$sql_query="SELECT *,MIN(time) FROM `fruit` WHERE time LIKE '0%' AND(afc LIKE '%芭樂%')AND (afc1 LIKE '%蘋果%' OR afc1 LIKE '%葡萄%' OR afc1 LIKE '%龍眼%')";
alex9453 iT邦新手 2 級 ‧ 2018-10-02 23:22:24 檢舉

但是當取到 afc1 值後 , 要再成為下一 row 的 afc , 這樣就可以一直排下去 , 到所有 row 完成 , 還要再研究看看

我要發表回答

立即登入回答