我有一個表項目與字段:ID,標題,created_by,組。
我也有與田組的另一個表:ID,CREATED_BY,組名
與領域最終表的用戶:ID,用戶名,密碼等。
想法是隻有登錄用戶創建的項目或登錄用戶是項目用戶組的一部分的項目才能被該用戶看到。
每個用戶可以是未指定數量的組的一部分,每個組可以包含未指定數量的用戶。
我現在可以想到做到這一點的唯一方法是爲每個用戶提供一個單獨的表(列出他們所屬的所有組)。
然後,我首先在項目表中搜索登錄用戶創建的項目。其次,搜索該用戶的「groups」表以找到它們所屬的每個組的ID,然後再次遞歸搜索項目表並加載當前找到的group_id與項目的組ID相匹配的每個項目。
我知道這將工作,如果編碼正確的少數項目,組和/或用戶,但我懷疑每個頁面將花費很長時間來加載/處理較大的表。對於每個用戶都有一張新表,因爲您可以擁有數千個用戶,因此可以有數千個表。
我懷疑表連接可能會提供解決方案,但我現在看不到如何。如果是這種情況,我很樂意重命名錶格字段來實現這一點。
我對檢索項目當前的代碼是這樣的(我知道這可能不是理想的):
$query = "SELECT * FROM items WHERE user_id=:u_id";
$stmt = $conn->prepare($query);
$stmt->execute(array(':u_id'=>$_SESSION['u_id']));
$exist = '<option></option>';
while($uRow = $stmt->fetch()) {
$exist .= '<option value="'.$uRow['id'].'">'.$uRow['title'].'</option>';
}
$user_groups_tbl = "user_groups_".$_SESSION['u_id'];
$query1 = "SELECT * FROM $user_groups_tbl";
$query2 = "SELECT * FROM items WHERE group_id=:group";
$stmt1 = $conn->prepare($query1);
$stmt2 = $conn->prepare($query2);
$stmt1->execute();
while($gRow = $stmt1->fetch()) {
$stmt2->execute(array(':group'=>$gRow['group_id']));
while($row = $stmt2->fetch()) {
if($row['user_id'] !== $_SESSION['u_id']) {
$exist .= '<option value="'.$uRow['id'].'">'.$uRow['title'].'</option>';
}
}
}
return $exist;
我希望我的需要和意圖是明確的。任何幫助,將不勝感激。
基本上相同,我的答案,但expmained更漂亮。 – thomasfedb 2010-07-13 01:31:44
內容豐富,讓我大笑!我知道我錯過了一些簡單的事情!謝謝! – drent 2010-07-13 08:02:09