【问题标题】:Having Trouble With SQL JOINSQL JOIN 遇到问题
【发布时间】:2016-04-22 23:48:27
【问题描述】:

我在使用 MySQL JOIN 时遇到问题,想知道是否有人可以帮助我。我正在加入的表格的快速概览。

User 表列(只是在这种情况下重要的列):

userId | active | role | username | addressId

Address 表列(只是在这种情况下重要的列):

addressId | firstName | lastName

ManagerRepRelationship

repId | managerId

以下是这些表之间的关系:

  • 创建新用户时,会为他们分配一个键 (userId),并且他们的地址信息会在地址中使用键 (addressId) 获得它自己的行。该 addressId 键与用户表中的用户行一起存储。

  • 此外,在创建用户时,他们会被分配以下两个角色之一:“经理”或“代表”。如果他们是代表,则必须为他们分配一名经理(显然,需要先创建一些经理,然后才能创建任何代表)。当代表分配给经理并创建时,代表的userID 存储在repId 列的ManagerRepRelationship 中,同时为该代表选择的经理userId 存储在同一行下managerId 列。

这是我遇到的麻烦。在编辑代表时,我想在顶部呼应分配给该代表的经理的姓名。在编辑页面上,我在 url 中传递了编辑代表的userId,因此它可以与$_GET["userID'] 一起使用。

我似乎无法编写正确的 JOIN 语句来获取经理的名字和姓氏,而不是正在编辑的代表。这是我到目前为止所拥有的,但我得到了空值。我希望我解释得足够好。

<?php
  $user_id = $_GET["userId"]; // the rep getting edited userId
  // grab all the reps address info and user info
  $user_result = mysqli_query( $connection,
                "SELECT Users.*, Address.*
                 FROM Users
                  JOIN Address
                  ON Users.addressId=Address.addressId
                 WHERE Users.userId=" . $user_id
              );
  $user_set = mysqli_fetch_array($user_result);

 // Trying to get the first and last name of the manager
 // That is assigned to this rep
   $result = mysqli_query( $connection,
                    "SELECT A.firstName, A.lastName
                     FROM Address A
                      JOIN Users U
                      ON A.addressId=U.addressId
                      JOIN ManagerRepRelationship M
                      ON M.repId=U.userId AND M.managerID=U.userId
                     WHERE U.role='manager' AND M.repId=" . $user_id
                   );
   $managerName = mysqli_fetch_array($result);
?>

【问题讨论】:

  • 哎呀抱歉。 1秒。我需要编辑这个。
  • 检查查询php.net/manual/en/mysqli.error.php 是否有错误,并可能报告错误php.net/manual/en/function.error-reporting.php
  • 您的User 表和您的Address 表之间的外键关系是向后的。如果您希望在用户和地址之间建立 1:many 关系,您的Address 表应该有一个userId 列,而User 表应该有一个addressId 列。想一想:如果您的addressId 列在User 表中不可为空,并且强制执行外键,则您需要在插入用户之前插入用户地址,这绝对是感觉向后。

标签: php mysql


【解决方案1】:

这个条件:

ON M.repId=U.userId AND M.managerID=U.userId

只有当一个人是他们自己的经理时才会如此。我认为您正在寻找的是这样的:

"SELECT
   A.firstName, A.lastName
FROM 
   Address A
   JOIN Users U ON A.addressId=U.addressId
   JOIN ManagerRepRelationship M ON M.managerID=U.userId
   WHERE U.role='manager' AND M.repId=" . $user_id

还应该提到的是,您的代码容易受到 SQL 注入的影响,因此非常不安全。

【讨论】:

  • 我正在清理我的变量。只是觉得将代码放在这个问题中有点过头了。感谢您的意见!
  • 这是正确的答案,而且效果很好!先生,为您投票并回答问题!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 2016-06-04
  • 2011-03-25
  • 2011-07-03
  • 1970-01-01
相关资源
最近更新 更多