iT邦幫忙

1

mysql 新增數值時檢查是否有相同資料

  • 分享至 

  • xImage

我目前在做 購物車功能 最近發現一個問題 我不想要使用者加入重複項目的時候會多一筆 例:我先買了10隻筆 還沒結單(我在某個欄位做判斷假如他是B就是有購買 沒B就是還沒結單) 我在多買10隻筆 他不會變成兩筆 而是舊的10在加入10
(題外話: 一開始以為直接在列印的地方用SUM 結果在減數量的時候有問題 ==川)
請問這有辦法在寫入時做判斷嗎?

https://ithelp.ithome.com.tw/upload/images/20200620/20109685A46eMFAQFm.png

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2020-06-20 14:10:46
最佳解答

就資料而言。「ON DUPLICATE KEY UPDATE」對你來說會比較好。
他會依照你的主鍵相依性來決定。
不過我相信你不懂如何建立複合式主鍵。去查一下學習吧。
要用ON DUPLICATE KEY招你一定得學的。

不過,你還是放棄sprintf的寫法好了。亂亂用還不如不要用。
以下是簡單的處理給你參考。沒值的話。就將資料新增。有值的話,就直接 count 數量+1處理。

INSERT INTO login_times (user_id, count) VALUES ('abc', 1) 
ON DUPLICATE KEY UPDATE count = count + 1;

如果真的沒辦法不行用複合性主鍵。那你還是乖乖的用select兩段式處理的方式。
怕被修改的話。就搭配一下交易吧。

看更多先前的回應...收起先前的回應...

不愧是 星空大大 真的直接點出我的缺點/images/emoticon/emoticon02.gif

不好意思 這句話 我不是很懂"怕被修改的話。就搭配一下交易吧。"

交易 = Transaction
不過我想如果你連複合式主鍵都不會了。

那交易對你來說可能會更有難度就是了。

抱歉 花這麼多時間才回
"ON DUPLICATE KEY UPDATE" 是成功了
可是現在有個問題 假如我A商品已經結單(狀態欄變成Y)
那再次新增的時候因該就會出現新的一筆 而不是繼續家在Y那筆
試了半天 都錯誤

$sql="select * from shop_cart where buy != 'Y'(
INSERT INTO shop_cart (user_name,user_phone,part_id,order_number)
VALUES('$insert_new0','$insert_new1','$insert_new2','$insert_new3')
ON DUPLICATE KEY UPDATE order_number = order_number + '$insert_new3'
)";

..............
我說真的,我不該要從何去說起了。
行為動作你混在一起搞??
多了那個select幹嘛?
為何不將這動作寫在程式??

拿sql做程式運算??
而且...你覺得有buy欄位值的。還需要「新增」動作??
都有資料了。還新增?????

因該是 這樣寫 你會比較清楚
我這個資料表分別放者 已結帳跟未結帳(判斷的欄位是"buy")
使用者:
我先買了 "1支筆 結帳"(此時buy已變成y) 我之後又買了一支筆問題發生了(我之後加入的這筆的數量會加到之前已經結帳的那支筆上)
目前我卡在這裡 我的感覺是 要再多一個判斷 當buy不是Y的時候
才會執行"ON DUPLICATE KEY UPDATE" 同一個項目數量新增 當他有Y的時候可以項目重複 數量不會新增

你先思考好「你覺得有buy欄位值的。還需要「新增」動作??」

不要拿資料庫跟程式混在一起想。
資料庫就是「是」寫,不是「不寫」

不要混在一起拿sql語法,當程式開發用。
搞到有點莫明奇妙的。

你會讓sql發瘋的。

我覺得因該要有 因為我買結帳後 之後還是會繼續買一樣的商品阿
這樣使用者就可以知道 假如我在6.20買過一次 6.22又買了
資料庫方面來看 這樣不就會有兩筆資料(兩個欄位buy都有Y) 還是說我哪邊邏輯怪怪的 抱歉請指導我

我想拿sql的原因是因為我覺得因該是要在寫入的時候就做判斷了
目前想到最笨的方法就是新建一個專門拿來放已經結帳的資料表

你現在說的已經不是程式上的問題了。而是規劃上的問題了。
依你的說法。「假如我在6.20買過一次 6.22又買了
資料庫方面來看 這樣不就會有兩筆資料」
這個論點就有幾個問題。

其一:兩筆資料是否合理:
這得看你這張表的特性為何,如果是購買記錄。這是合理的。
如果是購買數量。這是不合理的。

不過話題先轉回來。
就如說的。如果一次buy是y,一次buy是n。那請問兩筆記錄是否都得要存在。

總結:
你沒搞清楚你這張表實際要記錄的性質是什麼。
有一個buy的欄位來區分買與不買。理論上這就是一種購買記錄。
每一個動作一筆記錄是很正常的。也根本不會有數量加入的問題存在。
但如果有需要buy為y就得加入的動作。
理論上這個就不該從sql下手。正常流程因該是要把原本n的刪除。然後直接加數量。這動作該從程式來處理。而不該從sql處理。

請讓sql完整的給於寫的動作就好。
你自已先清楚一下自已的規劃。

再回想我剛說的問題。有buy欄位就代表已存在資料。為何還需要一個新增的動作呢??
不要混合你的思考。就單單操作資料庫的想法就行。
執行行為方式,跟資料寫入方式。不要混在一起。

我覺得我之前的資料表思考方向比較像
購物車(記錄買了甚麼產品名稱、數量)
+
購買紀錄(什麼時候購買買了甚麼數量)
看了你的說明有比較懂問題了 感恩

我接下來可能就是將這兩個拆開 這個問題就自動解開了

WQ iT邦新手 2 級 ‧ 2020-06-23 16:17:45 檢舉

就....一個是明細檔,一個是結算檔....

4
archer9080
iT邦研究生 3 級 ‧ 2020-06-20 09:34:30

不存在才 INSERT,存在就 skip
試試看是否是您想要的

看更多先前的回應...收起先前的回應...

現在有個問題 他需要key重複來做判斷 我資料庫這樣設不對嗎??

我是想說使用者一定會重複 所以不能當主鍵,料號也是 所以現在很難辦

$sql=sprintf("
INSERT INTO shop_cart(user_name,user_phone,part_id,order_number) 
VALUES
('%s','%s','%s','%s')
ON DUPLICATE KEY UPDATE 
order_number= order_number + '%s'"
,$insert_new0,$insert_new1,$insert_new2,$insert_new3,$insert_new3);
wrxue iT邦好手 1 級 ‧ 2020-06-20 11:23:27 檢舉

可以(使用者,料號)一組一起當主鍵

archer9080 iT邦研究生 3 級 ‧ 2020-06-20 11:31:06 檢舉

判斷是否重複(存在)的語句在這段

WHERE NOT EXISTS (
  SELECT 1 FROM `trip` WHERE `user` = "tony" AND `country` = "US" LIMIT 1
);

//當user=tony且country=US,NOT EXISTS就新增
你應該是判斷目前接收到的料號是否已存在?
所以應該是

WHERE part_id='$part_id'  

又是編輯完才看到補充@~@

我因該是要使用"如果不存在就 INSERT,存在就 UPDATE" 不能跳過

archer9080 iT邦研究生 3 級 ‧ 2020-06-20 12:05:03 檢舉

最近發現一個問題 我不想要使用者加入重複項目的時候會多一筆 例:我先買了10隻筆 還沒結單(我在某個欄位做判斷假如他是B就是有購買 沒B就是還沒結單) 我在多買10隻筆 他不會變成兩筆 而是舊的10在加入10

可是你的例子不會產生你問的問題呀(重複項目多買10隻筆,舊的10再加入10 --> 不是不會多一筆嗎)

"如果不存在才 INSERT,存在就 skip" 說明這樣說 我的理解是如果有他不會做任何事情?

0
rogeryao
iT邦超人 7 級 ‧ 2020-06-20 11:41:31

這個問題很有趣....
A : 以結帳(消費者要付費了)來區分的話 :
1.結帳前 : 資料只在網頁上就 javascript 之類的處理就好了 :
若是買10隻筆 => 商品 = 筆 , 數量 = 10 ;
在多買10隻筆 => 商品 = 筆 , 數量 = 20 ;
2.結帳後 : 寫到 mysql 內只會有一筆資料 ,不是寫入筆 10 就是寫入筆 20

B : 若是要記錄購物車內容(寫到 mysql)
購物車序號 => XX
若是買10隻筆 => 商品 = 筆 , 數量 = 10 ;
=> Insert ...購物車序號 values('XX'....
在多買10隻筆 => 商品 = 筆 , 數量 = 20 ;
=> Update ... where 購物車序號 = 'XX'

我要發表回答

立即登入回答