2012-10-30 39 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