【问题标题】:MySQL - Too many joins! Only display records if user has permissionMySQL - 连接太多!仅在用户有权限时显示记录
【发布时间】:2022-07-25 18:22:51
【问题描述】:

我正在尝试为我正在使用 PHP 开发的小型项目管理 CMS 进行 MySQL 查询。我有四张桌子;项目、项目信息、项目用户和帐户。我可以使用 JOIN 获取所有用户的所有项目列表,以及他们最近的项目名称和描述。但是,我想查看特定用户参与的所有项目(来自表 projectUsers)。每个项目在项目表中都有一个 creatorId,我可以通过在下面的查询末尾添加“AND a.creatorId = 1”来查询它。但是,如果用户的外键存在于 projectUsers 表中,我还需要另一个查询来显示所有相同的项目信息。

查询显示所有项目的相关信息:

SELECT p.projectId, p.projectInfoId, p.userId, a.creatorId, p.updatedTimestamp, p.projectName, a.timestamp, a.projectType, accounts.firstname, accounts.lastname 
FROM projects AS a 
JOIN projectInfo AS p ON p.projectInfoId = ( SELECT pi.projectInfoId FROM projectInfo AS pi WHERE pi.projectId = a.id ORDER BY pi.updatedTimestamp DESC LIMIT 1 ) 
INNER JOIN accounts ON a.creatorId=accounts.id 
WHERE a.deleted = 0

给我以下结果:

| projectId | userId | creatorId | updateTimestamp     | projectName              | timestamp           | projectType | firstname | lastname |
| --------- | ------ | --------- | ------------------- | ------------------------ | ------------------- | ----------- | --------- | ---------|
| 155       | 1      | 1         | 2022-07-25 10:10:28 | Chicken Nugget Dispenser | 2022-07-25 10:04:01 | Production  | Ryan      | Admin    |
| 156       | 1      | 1         | 2022-07-25 10:05:44 | Nugget Juice Dispenser   | 2022-07-25 10:05:44 | Design      | Ryan      | Admin    |

项目表

| id       | timestamp           | projectType | creatorId | deleted |
| -------- | ------------------- | ----------- | --------- | ------- |
| 155      | 2022-07-25 10:04:01 | Production  | 1         | 0       |
| 156      | 2022-07-25 10:05:44 | Design      | 1         | 0       |

项目信息表

| projectInfoId | projectId | userId | updatedTimestamp    | projectName              | projectDescription                         |
| ------------- | --------- | ------ | ------------------- | ------------------------ | ------------------------------------------ |
| 172           | 155       | 1      | 2022-07-25 10:10:28 | Chicken Nugget Dispenser | Dispenses chicken nuggets, idk... Update 2 |
| 171           | 155       | 1      | 2022-07-25 10:10:24 | Chicken Nugget Dispenser | Dispenses chicken nuggets, idk... Update 1 |
| 170           | 156       | 1      | 2022-07-25 10:05:44 | Nugget Juice Dispenser   | Dispenses chicken nugget juice.            |
| 169           | 155       | 1      | 2022-07-25 10:04:01 | Chicken Nugget Dispenser | Dispenses chicken nuggets, idk...          |

帐户表

| id | username | password | email | role    | firstname | lastname |
| -- | -------- | -------- | ----- | ------- | --------- | -------- |
| 1  | admin    | ******** | ***** | Admin   | Ryan      | Admin    |
| 35 | manager  | ******** | ***** | Manager | Ryan      | Manager  |
| 36 | user     | ******** | ***** | User    | Ryan      | User     |

项目用户表

| id  | addedTimestamp      | projectId | userId | addedBy | 
| --- | ------------------- | --------  | ------ | ------- |
| 213 | 2022-07-25 10:04:01 | 155       | 35     | 1       | 
| 214 | 2022-07-25 10:04:01 | 155       | 36     | 1       | 

我试图通过添加“INNER JOIN projectUsers ON 1=projectUsers.userId”来解决这个问题,但最终没有结果。我还尝试过对 projectUsers 进行子查询,以及在 IF EXISTS 上进行了几次尝试,但均无济于事。最终,我的 PHP 脚本将使用 $_SESSION 变量将外键“1”替换为数据库中的 userId,因此用户可以查看从 projectUsers 表中分配给他们的所有项目。

任何帮助将不胜感激!

谢谢, 瑞恩。

【问题讨论】:

  • 嗯,我在你的表中看不到任何权限

标签: mysql sql


【解决方案1】:

提供的权限是projectUsers(projectId,UserId)

    SELECT p.projectId, p.projectInfoId, p.userId, a.creatorId, p.updatedTimestamp, p.projectName, a.timestamp, a.projectType, accounts.firstname, accounts.lastname 
    FROM projects AS a 
    JOIN projectInfo AS p ON p.projectInfoId = ( SELECT pi.projectInfoId FROM projectInfo AS pi WHERE pi.projectId = a.id ORDER BY pi.updatedTimestamp DESC LIMIT 1 )
    INNER JOIN projectUsers pu on pu.projectId = a.id
    INNER JOIN accounts ON a.Id = pu.UserId 
       and accounts.id = ?
    WHERE a.deleted = 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    相关资源
    最近更新 更多