Php MySQL查询多个ID
我已经构建了一个成员资格应用程序,允许用户组装项目,其内容包含在两个表“projects”和“notes”中。每个成员都可以创建、更新或删除任意数量的项目 很好,到目前为止 我希望成员能够与他们选择的其他成员共享他们的项目。此时,我已经构建了一个功能,允许成员a键入电子邮件地址,以便与成员B共享项目。如果该电子邮件存在于DB中,则它将更新第三个表“共享”,其中包含项目所有者ID成员a,与成员ID成员B和项目ID共享的_。也许我在错误的方向上固执了 问题是:如何查询DB以向成员B显示他们自己的所有项目+与他们共享的任何项目?下面的查询说明了我一直以来的方向,但这一方向毫无用处。我想说的是,从user_id=me的项目中选择所有项目,并在“shared_with”列下的“sharing”表中选择我的id所在的所有相应项目。。。哦,是的,抓住那个项目的id,以便知道你在做哪个项目 我的脑子乱七八糟。如有任何指示,我们将不胜感激Php MySQL查询多个ID,php,mysql,mysqli,Php,Mysql,Mysqli,我已经构建了一个成员资格应用程序,允许用户组装项目,其内容包含在两个表“projects”和“notes”中。每个成员都可以创建、更新或删除任意数量的项目 很好,到目前为止 我希望成员能够与他们选择的其他成员共享他们的项目。此时,我已经构建了一个功能,允许成员a键入电子邮件地址,以便与成员B共享项目。如果该电子邮件存在于DB中,则它将更新第三个表“共享”,其中包含项目所有者ID成员a,与成员ID成员B和项目ID共享的_。也许我在错误的方向上固执了 问题是:如何查询DB以向成员B显示他们自己的所有
function find_all_projects($id) {
global $db;
$sql = "
SELECT *
FROM projects
LEFT
JOIN sharing
on projects.id = sharing.project_id
WHERE user_id = '" . db_escape($db, $id) . "'
OR sharing.shared_with = '" . db_escape($db, $id) . "'
ORDER
BY project_name
";
$result = mysqli_query($db, $sql);
confirm_result_set($result);
return $result;
}
您可以将成员和项目之间的另一种关系与如下表一起使用:
CREATE TABLE `project_members` (
`project_id` INT NOT NULL,
`member_id` INT NOT NULL,
`is_owner` TINYINT NOT NULL DEFAULT 0,
PRIMARY KEY (`project_id`, `member_id`));
此表允许您将多个成员链接到多个项目。
列is_owner是一个布尔值,可以轻松查看该成员是所有者还是项目已共享给他。
另外,最好将外键添加到项目id和成员id。当前表结构
根据您的问题,我相信您当前的表格结构如下所示:
TABLE: user TABLE: project TABLE: shared
id | email | | id | user_id | content | | id | user_id | project_id
---+-------------------- ---+---------+------------------------------ ---+---------+------------
1 | james@website.com | | 1 | 1 | Project for James | | 9 | 1 | 5
2 | hannah@website.com | | 2 | 1 | Some other project for James | | 10 | 3 | 5
3 | lucy@website.com | | 3 | 2 | Project for Hannah | | 11 | 1 | 8
| | | 4 | 2 | A new project for hannah | | 12 | 2 | 8
| | | 5 | 2 | Hannah's pride and Joy | |
| | | 6 | 3 | Lucy cracking down | |
| | | 7 | 3 | Lucy's second project | |
| | | 8 | 3 | Lucy's public stuff | |
SQL
例如:
交替表结构
我建议更新表结构,以便有效地拥有三个表:用户、项目和项目用户。然后,project_用户表充当两个实体用户和项目之间的管道。在这种情况下,存储两个对象之间的关系,即所有者与共享者之间的关系
TABLE: user TABLE: project TABLE: project_user
id | email | | id | content | | id | user_id | project_id | role
---+-------------------- ---+------------------------------ ---+---------+------------+-----
1 | james@website.com | | 1 | Project for James | | 1 | 1 | 1 | 1
2 | hannah@website.com | | 2 | Some other project for James | | 2 | 1 | 2 | 1
3 | lucy@website.com | | 3 | Project for Hannah | | 3 | 2 | 3 | 1
| | | 4 | A new project for hannah | | 4 | 2 | 4 | 1
| | | 5 | Hannah's pride and Joy | | 5 | 2 | 5 | 1
| | | 6 | Lucy cracking down | | 6 | 3 | 6 | 1
| | | 7 | Lucy's second project | | 7 | 3 | 7 | 1
| | | 8 | Lucy's public stuff | | 8 | 3 | 8 | 1
| | | | | | 9 | 1 | 5 | 2
| | | | | | 10 | 3 | 5 | 2
| | | | | | 11 | 1 | 8 | 2
| | | | | | 12 | 2 | 8 | 2
SQL
例如:
PHP
您应该考虑使用参数化,而不是手动转义用户数据并将其注入查询中。我认为表必须不仅共享,而且完全可用。该项目与任何人(包括业主和用户)之间的关系将在其中提及。在这种方案中,项目的选择过程非常简单。项目表中的“根据”列检测到所有者。如果是我,我现在已经忘记了所有非sql的东西,而是专注于queryI,开始时的路径与之类似,但由于多个用户与多个用户共享多个项目,我遇到了螺旋式的复杂情况。@LyleCrumbstorm使用这样的联接表往往不复杂;你遇到了什么麻烦事?我想我还没有完全意识到这个建议。它与您的相同,只是没有扩展的解释,对吗?@LyleCrumbstorm是的,这只是根据我的回答实现联接表。@LyleCrumbstorm您必须执行两个查询。一个用于获取所有所有者的项目,另一个用于获取与这些项目相关的所有用户:选择pm.project\u id,member.*从member m加入project\u members pm ON pm.member\u id=m.id,其中pm.project\u id位于所有者项目id的列表中,is\u owner=0用准备好的语句替换所有者项目id的列表。另外,如果您使用PDO而不是mysqli,您可以拥有一个非常好的数组:,数组的每个键都可以保存项目的id,每个值都是与项目相关的所有用户
AND project.user_id <> ?
$sql = "
SELECT project.id, project.user_id AS owner_id, shared.user_id AS shared_id, project.content
FROM project
LEFT JOIN shared
ON project.id = shared.project_id
AND project.user_id <> ?
WHERE project.user_id = ?
OR shared.user_id = ?
";
$query = $mysqli->prepare($sql);
$query->bind_param("iii", $user_id, $user_id, $user_id);
$query->execute();
TABLE: user TABLE: project TABLE: project_user
id | email | | id | content | | id | user_id | project_id | role
---+-------------------- ---+------------------------------ ---+---------+------------+-----
1 | james@website.com | | 1 | Project for James | | 1 | 1 | 1 | 1
2 | hannah@website.com | | 2 | Some other project for James | | 2 | 1 | 2 | 1
3 | lucy@website.com | | 3 | Project for Hannah | | 3 | 2 | 3 | 1
| | | 4 | A new project for hannah | | 4 | 2 | 4 | 1
| | | 5 | Hannah's pride and Joy | | 5 | 2 | 5 | 1
| | | 6 | Lucy cracking down | | 6 | 3 | 6 | 1
| | | 7 | Lucy's second project | | 7 | 3 | 7 | 1
| | | 8 | Lucy's public stuff | | 8 | 3 | 8 | 1
| | | | | | 9 | 1 | 5 | 2
| | | | | | 10 | 3 | 5 | 2
| | | | | | 11 | 1 | 8 | 2
| | | | | | 12 | 2 | 8 | 2
SELECT project.id, project_user.user_id, project_user.role, project.content
FROM project
JOIN project_user
ON project_user.project_id = project.id
WHERE project_user.user_id = ?;
$sql = "
SELECT project.id, project_user.user_id, project_user.role, project.content
FROM project
JOIN project_user
ON project_user.project_id = project.id
WHERE project_user.user_id = ?
";
$query = $mysqli->prepare($sql);
$query->bind_param("i", $user_id);
$query->execute();