0

だから、リストの要素の順序を取得したい。順序はユーザーによって事前に設定され、以下の表に格納されます。リスト要素の名前と説明も取得したいので、2 つのテーブルを結合する必要があります (以下を参照)。

ただし、実際に取得されるのは 16 個の要素を含む配列です (現在は 4 個の要素しか存在しないため、4 個のはずです)。配列は長すぎてここに投稿できませんが、興味がある場合は、phpFiddle に入れてここで見つけられるようにします。

さて、私は実際に何が問題なのかを見つけようとしましたが (おそらくいつものように簡単なことです)、運がありませんでした。

お時間をいただき、ありがとうございました。

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;       
    }

データベース.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)

この 2 番目の形式には、実際にはあいまいさが存在しない場合でも、「あいまいな列」エラーを回避できるという利点があります。

于 2012-10-30T22:59:28.887 に答える