我在3个表中构建了数据库:
members - membersitems - items
---------------------------------------------------------
memberid - memberitemid - itemid
username - itemid - itemname
password - memberid - itemtype
etc
这个想法是,每次成员获得新项目时,都会向其中添加一行membersitems
。该membersitems
表旨在将两个表连接在一起。我不确定是否只有两个表和JOIN
?有更简单的方法。
使用“$_SESSION["memberid"]
我在membersitems
表中选择成员标识与会话相同的行”:
$stmt = $db->prepare('SELECT itemid FROM membersitems WHERE memberid = :memberid');
$stmt->execute(array(':memberid' => $_SESSION['memberID']));
$array = $stmt -> fetchAll(PDO::FETCH_ASSOC);
foreach($array as $row) {
$itemid[] = $row['itemid'];
}
我不确定下一步如何整理此数据的最佳方法,但是我尝试使用逗号分隔的字符串:
$itemids = '[' .implode(',', $itemid). ']';
/// echos out: [1,2,3,4,5,6,6,6,]
请注意,第6项有3个。我想显示3个第6项。
然后,我尝试使用以下代码在项目表中选择数据,该代码不起作用,但未返回错误:
$arr = $itemids;
$in = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM items WHERE itemid IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($arr);
$data = $stm->fetchAll();
我还希望获得一些有关分离返回的数据以及可能按类型排序的建议。
我对服务器端脚本和mySQL还是很陌生,但是可以处理批评。请尽可能严格,但请假设我的知识是基础。可接受的答案将是正在教授的答案,而不仅仅是解决方案。
我知道也有类似的问题,我尝试过其他与这个概念相似的示例,但努力填补存在细微差别的空白。
先感谢您。
正如某些注释中所暗示的那样,这是一个非常简单的SQL概念,称为JOIN。
您正在使用WHERE IN,它在JOIN家族的近亲中叫做INNER JOIN。
您需要阅读一些有关JOIN的文档,但足以说明INNER JOIN可用于过滤另一个表中的一个表。例如,如果要从连接表中的membersid过滤的项目表中获取项目,则可以使用如下查询进行操作:
SELECT i.*
FROM items i
INNER JOIN membersitems m
ON i.itemid = m.memberid
WHERE m.memberid = :memberid
在大多数情况下,与执行两次查询相比,这是一种获取与给定memberid关联的项目的更有效的方法(如注释中所述,最好避免在PHP中对逗号进行序列化的ID,然后再进行查询)。
附带说明一下,子查询将是使用与当前查询类似的语法来实现您的目标的另一种方式:
SELECT *
FROM items
WHERE itemid
IN (
SELECT itemid
FROM membersitems
WHERE memberid = :memberid
)
还有一张便条。您的表架构可能是多余的,具体取决于您在成员和项目之间的关系类型。您将需要阅读一对多与多对多的架构设计。如果可能的话,您拥有的设计就是一个好的设计:1)一个成员拥有多个项目并且2)一个项目拥有多个成员但是,如果项目表中的每个项目都与一个成员相关联并且只有一个成员(我怀疑可能是这种情况),您可以使用如下所示的模式:
members - items
------------------------------
memberid - itemid
username - memberid
password - itemname
etc
在上面的模式中,每个项目都负责了解其父成员,这足以执行以上两个查询(只需替换适当的表名)。
最后的笔记。这绝不是id
必需的,但是对于表来说,仅具有被称为(而不是itemsid,membersid)的id列是很普遍的。在联接表(例如items_id
和members_id
)中用下划线分隔单词是相当常见的sql约定。
玩得开心,祝你好运!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句