0

所以,我想检索列表元素的顺序。顺序由用户预先设置,并存储在下表中。因为我还想检索列表元素的名称和描述,所以我需要组合两个表(见下文)。

但是,实际检索到的是一个包含 16 个元素的数组(应该是 4 个,因为它现在只存在 4 个元素)。该数组太长,无法在此处发布,但如果您有兴趣,我将其放在 phpFiddle中,以便在此处找到。

好吧,我真的试图找出问题所在(可能像往常一样容易),但没有运气。

非常感谢您的时间和帮助!

列表模型.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;       
    }

数据库.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

列表元素

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'是元素的最终顺序(所有用户平均),不能与其他表中同名的元素混合,这只是特定用户对列表元素的顺序(其中在这种情况下是有趣的)。

4

1 回答 1

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)

第二种形式还具有在实际上没有歧义时避免“歧义列”错误的优点。

于 2012-10-30T22:59:28.887 回答