2011-10-03 152 views
1

我正在爲我的網站設計一個「朋友」系統。我在我的數據庫中有一個USERS表,這個表中有兩個字段叫做「friendrequestssent」和「friendrequestsreceived」。如何檢查逗號分隔字段中是否存在值?

當用戶發送好友請求給其他用戶,它存儲了USERID到其他人的「friendrequestsreceived」字段和其他人的USERID到他的「friendrequestssent」領域,都與一個尾隨逗號(即:12345,)。

我需要檢查,看是否有要求,以防止重複請求已經存在,而且到目前爲止,我已經試過這樣:

$sql = "SELECT * FROM users WHERE userid = $userid AND $profileid IN (friendrequestssent);"; 
    $sent = mysql_num_rows(mysql_query($sql)); 
    $sql = "SELECT * FROM users WHERE userid = $profileid AND $userid IN (friendrequestsreceived);"; 
    $received = mysql_num_rows(mysql_query($sql)); 
    if(($sent > 0) && ($received > 0)) { 
//do stuff here 
} 

這很好工作在第一,但如果用逗號隔開值存在於該字段中(即:12345,12346,),IN語句不再查找該值,並且行數保持爲零。

據我所知,我不明白爲什麼MySQL查詢中的IN語句不會看到該值。

另一方面,我敢肯定還有更好的方法來做到這一點。我現在還不確定。請指教。

+0

在數據庫中的CSV是邪惡的,它會直接送你到地獄。 – Johan

+0

是不是IN()類型特定?即你不混合整數和字符串,而且你實際上是將一個整數(用戶ID)傳遞給一個字符串(csv) - 如果沒有逗號,它可能就可以評估一串數字作爲一個整數。我不是100%確定,因爲我從來沒有在數據庫中使用CSV - 他們只是尖叫着「這應該是一個鏈接表」給我... – CD001

回答

0

你的設計是好的,但它會更好,如果你讓我重新設計這個給你:

首先離開你的表的用戶,因爲它是,然後做一個新表3個字段:

  • 作爲索引的自動增量字段(如果需要,或者只是略過此列)。
  • 一個字段,您存儲請求友誼的朋友並讓我們調用:friend_request。
  • 一個字段,用於存儲正在接收友誼請求的朋友,並允許呼叫ir:friend_receive_request。

您應該添加propper外鍵索引,並且請注意,通過在不同的列中存儲相同的友誼,您可能會有重複的請求。如果您有問題,我可以更清楚地說明這一點。

+0

啊,是的,我可以看到如何爲朋友請求提供一個單獨的表格可以更有效率。我做了一些重新配置,它的工作非常好。謝謝! – vertigoelectric

1

IN子句着眼於一個逗號分隔的列表的各個成員,但是當你存儲在一個字段,用逗號分隔的列表中,MySQL將其視爲一個字符串值,所以你在做

... WHERE x IN ('1,2,3') 

換算成

... WHERE x = '1,2,3' 

要強制MySQL來治療CSV列表爲CSV,而不是一個整體的字符串,你需要FIND_IN_SET()功能:

... WHERE FIND_IN_SET($profileid, friendrequestssent); 
+0

雖然爲朋友請求創建一個單獨的表是一個更有效的解決方案,你的答案仍然有用,以防我再次需要使用像'IN'這樣的東西,我相信我會的。謝謝。 – vertigoelectric

1

不要將單個字段視爲多行。爲此使用一張桌子。喜歡的東西:

friend_requests 
=============== 
friend_id 
requested_friend_id 

friend_idrequested_friend_id將包括一個複合鍵。

0

你可以做的一件事就是獲取包含所有id的整個條目,並以數組或字符串的形式適當地進行字符串搜索或數組搜索以檢查重複。

相關問題