2016-02-13 26 views
1

我有陣列這樣更新列隨着陣列(Mysql的程序)

text_id_array=["1011", "1012", "1013"] 

我想將它傳遞到MySQL程序在那裏它與陣列成員相匹配的更新的列,以便我試圖

BEGIN 
UPDATE chat_texts a SET a.read_by=a.read_by+1 WHERE a.text_id IN (text_id_array); 
END 

但它只適用於陣列的第一個成員。我知道有很多這樣的問題,但我找不到解決方案。感謝您的幫助!

+0

你爲什麼在MySQL中完全做這件事?有人會手動將數組傳遞給數據庫似乎不太可能。 – Strawberry

+0

因爲我發送了一些text_ids來將它們的** read_by **值+1轉換爲DB。我可以用PHP循環做,但我認爲發送所有這些ids在一個數組,並完成休息操作與MySQL程序會給我一個更好的表現。 – rotring05

+0

我明白了。我懷疑PHP解決方案會更快。請記住*在循環內部*構建*查詢,但*在循環外執行*查詢。 – Strawberry

回答

0

現在我找到了。感謝您推薦使用FIND_IN_SET,但我也注意到,我應該改變我的參數爲VARCHAR。那麼它就是

CREATE DEFINER=`root`@`localhost` PROCEDURE `aa`(IN `text_array_id` VARCHAR(255)) 
BEGIN 
UPDATE chat_texts a SET a.read_by=a.read_by+1 WHERE FIND_IN_SET(a.text_id, text_array_id); 
END 
1

如果您有興趣使用非數組方法,FIND_IN_SET可能會有所幫助。

這可能會幫助你開始:

SET @strIDs ="1011,1012,1013" 
UPDATE chat_texts a SET a.read_by=a.read_by+1 WHERE FIND_IN_SET(a.text_id, @strIDs); 
+0

不起作用。仍然有同樣的問題。我認爲主要問題是傳遞數組到程序,因爲當我使用'更新chat_texts一個SET a.read_by = a.read_by + 1 WHERE a.text_id IN('1010','1011')'它按預期工作,但當我打電話它採取像**這樣的參數('1010,1011')** – rotring05