所以,我想检索列表元素的顺序。订单由用户设置,并存储在下表中。因为我还想检索列表元素的名称和描述,我需要组合两个表(见下文)。
然而,实际检索的是一个包含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'是元素的最终顺序(所有用户的平均值),不能与具有相同名称的元素混合使用在另一个表中,这只是列表元素的特定用户的顺序(在这种情况下这是有趣的)。
答案 0 :(得分: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)
第二种形式还有一个优点,即在实际上没有歧义的情况下避免出现“模糊列”错误。