台灣最大程式設計社群網站
線上人數
1676
 
會員總數:242277
討論主題:187367
歡迎您免費加入會員
討論區列表 >> PHP >> 如何把select後的值 ,當作update 的 條件
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
如何把select後的值 ,當作update 的 條件
價值 : 100 QP  點閱數:374 回應數:7

樓主

zoe
門外漢
0 1
13 1
發送站內信

抱歉,我是PHP的新手,我都是在網路上學習得, 我要做學校的專題,我以下程式碼卡在一個地方,
$sql="SELECT id, MIN('time') from member WHERE start=4 ORDER BY member.id ASC ";
$result=mysql_query($sql) ;
$row=mysql_fetch_row($result);
echo '1';

$sql="update member set start=1 where id=$row[0]";
$result=mysql_query($sql);
這部分我要做的是先在資料庫裡找 start=4,然後時間最早ID最小的然後把他的start這項改成1,我測試過我select 那行是有找到我要的可是我要如何讓找到的ID變成我更新的條件?
我試過 mysql_fetch_row ,assoc ,array ,field ,都沒辦法,也都沒有輸出,請問是為什麼?




搜尋相關Tags的文章: [ update select ] ,
本篇文章發表於2017-11-27 04:46
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
最有價值解答

P陳
檢舉此回應
用子查詢就可以了

update Table1 set ..... where id=(select id from table2 where start=4 ORDER BY member.id ASC)

注意:子查詢只能有一個欄位輸出(如本例的ID,不能放 ID,time)

本篇文章回覆於2017-11-27 08:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

P陳
檢舉此回應
奉送一題
這樣 子查詢會取回 time 最小的那筆
update Table1 set ..... where id=(select top 1 from table2 where start=4 ORDER BY time ASC)


SELECT id, MIN('time') <--這堛 time 不能加 ' ' ,就會被當成文字處理了
本篇文章回覆於2017-11-27 08:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
不錯的參考

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
這邊你犯了一項錯誤。

你要找的是最少時間的id。所以你利用min的做法就已經是錯誤的。
正常你因該是要用order來排序time ASC讓最小時間排在第一個。然後只取第一筆的資料。
其第一筆的資料中的id才是你要改的id。
正確的sql用法是 SELECT id FROM WHERE member WHERE start=4 ORDER BY member.time ASC

你原本的用法只會取到最小數值的id。這不會是你要的值。
不要以為用min就會幫你排除。min的用法是幫你找出條件內所對應的最小值而已。但也只是其欄位的最小值。
其它欄位還是會遵從order的條件出現的。不要去誤會他的用法。

這邊要注意到一件事。其time的值。是否會有機會同分同秒的情況。
因為一次只能處理一個id。除非你有新的機制來解決這個問題。

再來,#2有說到一個重點。MIN('time')這邊你不能用單引號來做標示。這會造成sql會用字串模式而非欄位處理。
因為你用字串的方式,理論上因該也會出錯才對。

由於你並非是想要學寫程式的人員。其它細節我就不說明清楚了。
如pdo的用法跟一些操作性的用法。我就不多做說明。只針對你想要的問題做回應處理。

除非你未來想要往這一行業走。可再請教更多的細節。

本篇文章回覆於2017-11-27 13:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

zoe
檢舉此回應
#2 感謝!我成功了
$sql="update `member` set `start`=1 where `id`=(select `member_1`.`id` from ((select * from `member` where `start`=4 )as `member_1`)where `member_1`.`start`=4 ORDER BY `member_1`.`time` ASC limit 1)";
我之前也有使用過子查詢,然後失敗,原來他不能在同個TABLE,然後我使用的MYSQL好像用TOP會錯誤,我使用limit 不知道這樣行不行
雖然我成功了,但是我不知道我這樣寫還會不會有問題
#3 謝謝,這是我第1次碰PHP ,因為時間不夠我慢慢學,我只能先有才求好,細節部分我會再慢慢學習
本篇文章回覆於2017-11-27 23:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

P陳
檢舉此回應
1.您的指令用 `member` 在VB.Net 是不能用 的(也許是PHP的特性)
2.子查詢可以輸出兩個以上欄位,以前沒有注意到???? (ACCESS 是不行的)
3.可以同一個TABLE
4.如果子查詢會回傳多筆 要加IN
update Table1 set ..... where id= IN (select ID from table2 where start=4 ORDER BY time ASC)

5.如果這問題解決了,請將討論串關閉

6.加油
本篇文章回覆於2017-11-28 09:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
回#5

1.只要有用``包起來的名稱。全可以當欄位名使用。這其實不是php的特性。而是mysql的特性。
任何一種程式包含你說的VB.NET都可以這樣用的。

2.子查尋原本就沒限制可以輸出幾個欄位了。重點是看你要用在哪邊。如果你用在where內。
在1對1的情況下當然只能輸出一個欄位,要不然也無法判斷。

3.yes

4.回傳多筆並不一定要用in。正確的說法是只要條件是多筆不搜尋唯一值的情況下。就會是多筆。

回#4
1.使用多重子查尋很容易造成sql的效能變差。因該要用簡單的方式來處理。而不要只想要靠sql來處理。
當然如果你的筆數很少的情況下還無所謂。
但要記得,其實這樣的用法並不是很正規而且危險。當筆數達到一定的數量。
這樣的用法會讓主機崩潰的。

2.top並非是mysql的用法。你使用limit是一個不錯的想法。

3.基本上這要看你有沒有打算未來走上這條路上。要不然認真來說。
你的程式碼是要打掉重做的。
當然,如果只是要應付學業。只要有結果出來就行了。
這也是我為何不會說太明的原因。
但如果你是一個正在幫公司寫的程式。我就會把你給打槍的。
本篇文章回覆於2017-11-28 10:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

P陳
檢舉此回應
TO 浩瀚星空:
感謝您

又學到一招了 ' ' 可以這樣用,日前當有需要時我是 [ ] 來包的,還沒有用過' ' 來包。
其他的也感謝說明。
本篇文章回覆於2017-11-28 14:43
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.