【问题标题】:How to JOIN 4 table如何加入 4 个表
【发布时间】:2019-08-20 01:46:56
【问题描述】:

目前我有 4 张桌子。 activitycategorypicuseraccount

在这个系统中,有两个用户:申请人和负责人。申请人将登录并请求活动(将存储在表活动中)。

然后根据类别分配负责人(将与他们的姓名和activityID一起存储在表pic中)

activity: `activityID`(PK), `username`, `categoryID`
category: `categoryID`(PK), `categoryName`
pic: `activityID`, `personincharge` (name of the pic)  
useraccount: `name`, `username`

注意:表 pic 中的 personincharge 和表 useraccount 中的 name 具有相同的值。

注2:我将使用categoryID 加入表格类别和活动以显示categoryname

我的系统将让用户使用username 登录。我想显示负责人的活动记录表,这意味着它只会显示用户(登录的人)负责的活动。

目前我只能加入表格类别和活动并显示它。这是我所拥有的:

$sql = "
SELECT * 
  FROM activity a
  JOIN category c 
    ON a.categoryID = c.categoryID
 WHERE a.username= '".$_SESSION['username']."'";

经历了如此多的尝试和错误,但仍然找不到答案。提前感谢您的帮助。

我的系统流程:
情况1:
用户登录 -> 用户请求活动 -> 管理员将选择活动负责人(图片的名称将与活动ID一起插入图片表中)

情况2:
pic login -> pic 查看他/她被分配负责的活动列表并对请求采取行动。

**情况 2 是我目前所坚持的。仅显示分配给他/她的活动。

【问题讨论】:

  • 这里存在 SQL 注入安全风险
  • 这不是“准备好的声明”!?!
  • @philipxy 我已经提到了我被困的地方。我想在图片登录后显示负责人分配的活动列表。问题出在查询,加入表。
  • 这不是你的帖子所说的,不清楚。 PS 请在代码问题中提供minimal reproducible example--剪切&粘贴&可运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和版本;明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。)

标签: php mysql sql join


【解决方案1】:

如果你在做内部连接,那么你也可以使用 where 子句进行连接,如下所示:

SELECT * FROM activity as a, category as c, pic as p, useraccount as u WHERE a.categoryID = c.categoryID, a.activityID = p.activityID, p.personincharge = u.name

【讨论】:

  • 这不是连接的好方法。这种语法来自 90 年代,不是好的做法。如果你正在使用它,你应该停止。
  • 只有特殊情况下的外连接才需要连接。当您希望行匹配所有连接但没有部分连接时。那时 JOIN 被引入标准。没有其他区别。
【解决方案2】:

一个: 不要以智能快捷方式命名您的表格。想想你正在优化什么,你正在失去什么!在实际查询中使用“table AS t”快捷方式。

两个: 您的表personsincharge 包含负责人。加入它。 accountname 是请求者帐户。加入 presonsincharge 后,您可以访问 handlers

三: 不要使用 POST 值来连接 SQL 字符串

【讨论】:

  • 1.在改变你所说的之后。没什么大不了的。仍然是同样的错误。仍然无法显示我想要的。 2.这就是我一直在做的事情,也是这里的答案,与负责人一起加入。在您的情况下,谁是处理程序? 3. 我没有使用帖子值。
【解决方案3】:

你可以像这样在同一个查询中有多个连接:

$sql = "SELECT * FROM activity a 

INNER JOIN category c ON a.categoryID=c.categoryID
INNER JOIN table_name as table_alias ON table_alias.ID = another_alias.ID
INNER JOIN ...
INNER JOIN ........
INNER JOIN ......

WHERE a.username= '".$_SESSION['username']."'";

【讨论】:

  • 这里存在 SQL 注入安全风险
  • 是的,他想明白,他不想放安全;)
【解决方案4】:

试试这个

select a.activityID, b.categoryName, c.personincharge, d.name
FROM activity a 
LEFT JOIN category b ON b.categoryID = a.categoryID 
LEFT JOIN pic c ON c.activityID = a.activityID 
LEFT JOIN useraccount d ON d.username = a.username
WHERE d.username= '".$_SESSION['username']."'";

【讨论】:

  • 您的最终连接呈现为内部连接。这是你的意图吗?
  • @Strawberry 是的
  • 在这种情况下,将其写为 [INNER] JOIN 似乎是明智的
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多