MySQL查询多个ID
MySQL Query Multiple ID's
我构建了一个会员应用程序,允许用户 assemble 项目,其内容包含在 2 table 中('projects' 和 'notes')。每个成员都可以创建、更新或删除任意数量的项目。
到目前为止还不错...
我希望成员能够与他们选择的其他成员共享他们的项目。在这一点上,我已经构建了一个功能,允许成员 A 输入电子邮件地址以共享项目(比如,与成员 B)。如果该电子邮件存在于数据库中,它会使用项目所有者的 ID(成员 A)、“shared_with”成员的 ID(成员 B)和项目 ID 更新第三个 table 'sharing'。 (也许我的方向错了?)
问题:我如何查询数据库以向成员 B 显示他们自己的所有项目以及与他们共享的任何项目?下面的查询说明了我一直没有用的方向。我想说的是,“Select 所有来自 user_id = (me) 的项目以及我的 ID 在 'sharing' table 下的所有相应项目 'shared_with' 专栏。...哦,是的,抓住那个 project_id 以便在你做的时候知道是哪个项目。"
我的脑子是糊状的。任何方向将不胜感激。
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;
}
您可以使用 table 成员和项目之间的另一种关系,如下所示:
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`));
这 table 允许您将许多成员链接到许多项目。
is_owner
列是一个布尔值,可以轻松查看成员是否是所有者或项目是否已共享给他。
另外,最好将外键添加到 project_id
和 member_id
.
当前Table结构
根据你的问题,我认为你当前的 table 结构类似于以下内容:
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
示例:https://www.db-fiddle.com/f/6KnEsGUmy5PS42usmzyTEX/0
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 = ?;
N.B.
此 SQL 陈述与您问题中的陈述之间的主要区别是
AND project.user_id <> ?
如果 ON
子句中没有该条件,您将获得该用户的每个共享项目的重复记录。 IE。如果用户已与 20 个用户共享项目,则将有 20 个重复项。
这是此处解释的预期行为:
PHP
$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结构
我建议更新您的 table 结构,以便您拥有三个 table(有效:users
、projects
和 project_users
)。 project_user
table 然后充当两个实体(users
和 projects
)之间的管道。在这种情况下,存储两者之间的关系(即所有者与共享对象)。
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
示例:https://www.db-fiddle.com/f/imQZ6cvEEff4VgRQ4v22Qo/0
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 = ?;
PHP
$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();
我构建了一个会员应用程序,允许用户 assemble 项目,其内容包含在 2 table 中('projects' 和 'notes')。每个成员都可以创建、更新或删除任意数量的项目。
到目前为止还不错...
我希望成员能够与他们选择的其他成员共享他们的项目。在这一点上,我已经构建了一个功能,允许成员 A 输入电子邮件地址以共享项目(比如,与成员 B)。如果该电子邮件存在于数据库中,它会使用项目所有者的 ID(成员 A)、“shared_with”成员的 ID(成员 B)和项目 ID 更新第三个 table 'sharing'。 (也许我的方向错了?)
问题:我如何查询数据库以向成员 B 显示他们自己的所有项目以及与他们共享的任何项目?下面的查询说明了我一直没有用的方向。我想说的是,“Select 所有来自 user_id = (me) 的项目以及我的 ID 在 'sharing' table 下的所有相应项目 'shared_with' 专栏。...哦,是的,抓住那个 project_id 以便在你做的时候知道是哪个项目。"
我的脑子是糊状的。任何方向将不胜感激。
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;
}
您可以使用 table 成员和项目之间的另一种关系,如下所示:
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`));
这 table 允许您将许多成员链接到许多项目。
is_owner
列是一个布尔值,可以轻松查看成员是否是所有者或项目是否已共享给他。
另外,最好将外键添加到 project_id
和 member_id
.
当前Table结构
根据你的问题,我认为你当前的 table 结构类似于以下内容:
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
示例:https://www.db-fiddle.com/f/6KnEsGUmy5PS42usmzyTEX/0
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 = ?;
N.B.
此 SQL 陈述与您问题中的陈述之间的主要区别是
AND project.user_id <> ?
如果 ON
子句中没有该条件,您将获得该用户的每个共享项目的重复记录。 IE。如果用户已与 20 个用户共享项目,则将有 20 个重复项。
这是此处解释的预期行为:
PHP
$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结构
我建议更新您的 table 结构,以便您拥有三个 table(有效:users
、projects
和 project_users
)。 project_user
table 然后充当两个实体(users
和 projects
)之间的管道。在这种情况下,存储两者之间的关系(即所有者与共享对象)。
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
示例:https://www.db-fiddle.com/f/imQZ6cvEEff4VgRQ4v22Qo/0
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 = ?;
PHP
$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();