2012-10-30 37 views
0

所以,我想檢索列表元素的順序。訂單由用戶設置,並存儲在下表中。因爲我也想檢索列表元素的名稱和描述,所以我需要組合兩個表(見下文)。錯誤的數據從數據庫中檢索

但是,實際檢索的是包含16個元素的數組(應該是4,因爲它現在只存在4個元素)。這個數組太長了,不能發佈到這裏,但如果你有興趣,我會把它放在一個phpFiddle to be found here中。

那麼,我真的試圖找到什麼是錯的(可能總是很容易),但沒有運氣。

非常感謝您的時間和幫助!

listModel.php:

public function GetOrderedElements($userId, $listId) { 

// $userId = 46 
// $listId = 1 

     $query = "SELECT le.listElemId, le.listElemName, le.listElemDesc, lo.listElemOrderPlace 
        FROM listElement AS le 
        INNER JOIN listElemOrder AS lo 
        ON le.listId = lo.listId 
        WHERE lo.userId = ? 
        AND lo.listId = ? 
        ORDER BY listElemId"; 

     $stmt = $this->m_db->Prepare($query); 

     $stmt->bind_param("ii", $userId, $listId); 

     $listElements = $this->m_db->GetOrderedElements($stmt); 

     return $listElements;  
    } 

database.php中:

public function GetOrderedElements(\mysqli_stmt $stmt) { 

     if ($stmt === FALSE) { 
       throw new \Exception($this->mysqli->error); 
     } 

     if ($stmt->execute() == FALSE) { 
       throw new \Exception($this->mysqli->error); 
     } 

     if ($stmt->bind_result($listElemId, $listElemName, $listElemDesc, $listElemOrderPlace) == FALSE) { 
      throw new \Exception($this->mysqli->error); 
     } 

     $listElements = array(); 

     while ($stmt->fetch()) { 
      $listElements[] = array('listElemId' => $listElemId, 
           'listElemName' => $listElemName, 
           'listElemDesc' => $listElemDesc, 
           'listElemOrderPlace' => $listElemOrderPlace); 
     } 

     var_dump($listElements); 

     $stmt->Close(); 

     return $listElements; 
    } 

從數據庫中:

listElemOrder

listElemOrderId | listId | listElemId | userId | listElemOrderPlace 
     1    1   1   46   1 
     4    1   2   46   4 
     2    1   3   46   2 
     3    1   4   46   3 

listElement

listElemId | listElemName | listId | listElemDesc | listElemOrderPlace 
     1   Elem A   1   Derp    NULL 
     2   Elem B   1   Herp    NULL 
     3   Elem C   1   Lorum   NULL 
     4   Elem D   1   Ipsum   NULL 

注:表中listElement 'listElemOrderPlace' 是元素的最後命令(所有用戶均),不與所述混合一個在另一個表中具有相同的名稱,這只是特定用戶的列表元素的順序(在這種情況下這是有趣的)。

回答

1

你忘了添加listElemId到您的加盟條件:

FROM listElement AS le 
INNER JOIN listElemOrder AS lo 
ON le.listId = lo.listId 
AND le.listElemId = lo.listElemId -- add this criterion 

由於列在兩個表中相同名稱的,可以縮寫爲:

FROM listElement AS le 
INNER JOIN listElemOrder AS lo 
USING (listId, listElemId) 

這第二種形式也有當事實上沒有模棱兩可的時候避免「模棱兩可」的錯誤的好處。

+0

非常感謝,工作得很好!你知道我如何能夠按排序順序檢索列表元素(1,4,2,3)嗎?無論我嘗試什麼,我都無法按照這個順序排列它們,無論是1,2,3,4還是1,3,2,4。 – holyredbeard