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_idmember_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(有效:usersprojectsproject_users)。 project_user table 然后充当两个实体(usersprojects)之间的管道。在这种情况下,存储两者之间的关系(即所有者与共享对象)。

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();