2011-05-26 42 views
0

我在製作聊天室IM。
如果用戶關閉窗口,我想要更新表格,這意味着他查看了他的朋友發給他的消息。
發生這種情況時,每個對話都有一個唯一的ID,因此我找到具有該ID的消息並將查看的列設置爲與用戶名相同。Mysql如果問題

但是,如果其他用戶也關閉了窗口,我希望將所有消息的查看列更改爲'both',以便任何用戶都不會彈出這些消息。 (默認情況下,所查看的列等於0)
我想要的是一個查詢,只需找到convo_id的所有消息,並且如果該消息已被其他用戶查看,意味着viewed!=0那麼它被設置爲其他兩個設置爲關閉該方框的用戶。

我有一個查詢,但它不起作用,因爲我沒有完全得到正確的語法。

只是想知道是否有人能改正它或提出一些建議。

$sql = "UPDATE chatbox IF (viewed!=?) THEN 
     SET viewed=? WHERE convo_id=? 
     ELSE 
     SET viewed=? WHERE convo_id=?"; 
$stmt18 = $conn->prepare($sql); 
$result = $stmt18->execute(array(0,$receiver,$convo_id,'both',$convo_id)); 
+1

爲什麼不直接產生在PHP代碼中兩個不同的UPDATE語句? – 2011-05-26 19:39:14

+0

您使用的是什麼味道的SQL? – 2011-05-26 19:39:56

+0

@AJ:大概是因爲它總是會執行兩條SQL語句。一個fo找出哪一個運行,一個運行它。這也是一種競爭條件。 – 2011-05-26 19:40:12

回答

4

你需要使用一個case語句:

update catbox 
set viewed = case when viewed = ? THEN ? else ? end 
where convo_id = ? 
+0

它起作用了,Paul,我非常感謝,但是你怎麼看待George創建一個單獨的桌子呢? – Scarface 2011-05-26 19:48:36

1

我建議你創建第二個表(或許叫「若干意見」),以記錄這些信息。當關閉事件發生時,您可以使用消息ID和用戶名在表格中插入一行。

這應該簡化查詢並避免在消息表中創建令人困惑的數據。

+0

這是一個很好的觀點,我一直認爲添加另一列比創建一個wholllee表要好。我對空間有點偏執哈哈。 – Scarface 2011-05-26 19:41:16

+1

如果您的新列將包含一個獨特的數據片段,那麼您是正確的。但是,由於確定應該放置在現場的邏輯涉及到邏輯,所以最好創建一個單獨的表格。這也將允許您的應用程序擴展 - 如果您決定在每次聊天中支持兩個以上的用戶,您目前的情況會發生什麼? – 2011-05-26 19:44:17

+0

再次感謝喬治,再次表示祝賀。其他類型的新消息和通知其實我還有其他表格。也許我可以鞏固他們。 – Scarface 2011-05-26 20:15:27