通过链接来自另一个表的外键查询来访问MysqlDB中的Row


Accessing Row from Mysql DB by chaining query of foreign key from another table

我很难找到从表中获得结果的最佳方法。我想通过一个使用主键的表从另一个使用外键的表中获取目标行。

表的设置类似于此(减去许多其他空间属性):

user Table:
  user_Id(pk)
  name
  type
  venue_Id(unique/indexed)
venue Table:
  venue_Id(fk)
  rating

逻辑流程为:user_Id由会话变量提供。查询DB表"user"以查找该用户。转到用户类型以确定用户是个人还是场地。假设用户是场所,则转到DB表"场所",并使用用户表中唯一/索引venue_Id中的外键查询表以进行评级。

查询看起来像

SELECT rating FROM `venue` WHERE `user_Id` = '$user_Id' AND `type` = 'venue'

这可能吗?如果可能,正确的方法是什么?

您有几种方法可以检索这些信息。

使用JOIN:

SELECT v.rating 
FROM venue v INNER JOIN user u
ON v.venue_id= u.venue_id 
AND u.`user_Id` = '$user_Id' AND u.`type` = 'venue'

使用IN子查询

SELECT rating 
FROM venue 
WHERE venue_id IN (SELECT venue_id FROM user
   WHERE `user_Id` = '$user_Id' AND `type` = 'venue')

顺便说一句,您应该考虑保护您的代码免受潜在的SQL注入

您这样解释有点不清楚。据我所知,这里有两张桌子——用户和地点。在User表中,u有:User_id,venue_id,name,type。在场地表中,你有:Venue_id,评级。

当您在user_id和type中使用WHERE子句时,您希望获得评级(VenueTable),这两个子句都存储在userTable中。

您的查询:从场所选择评分,其中user_Id='$user_Id',type='场所'

不可能像上面那样完成,因为您是从场地表中选择的,而user_id和type不在场地表中。因此,即使链接FK,它也会使其无法识别。因为FK只会显示并对父子表进行一些约束。

查询应该是这样的:

从场地v选择评分在v.venue_id=u.venue_id上加入用户u其中u.user_id='$user_id'和u.type='场地'

如果我错了,请纠正我。。

基于具有相等值列的表组合两个表中的行被称为equi-join操作,这是我们通常用来"遵循"外键关系的模式。

例如:

$sql = "SELECT v.rating
          FROM `venue` v
          JOIN `user` s
            ON s.venue_Id = v.venue_Id
           AND s.type` = 'venue'
         WHERE s.user_Id` = '" . mysqli_real_escape_string($con, $user_Id) ."'" 

这不是唯一的模式,还有其他几种查询表单将返回等效的结果。

作为使用EXISTS谓词的示例:

$sql = "SELECT v.rating
          FROM `venue` v
         WHERE EXISTS 
               ( SELECT 1 
                   FROM `user` s
                  WHERE s.venue_Id = v.venue_Id
                    AND s.type` = 'venue'
                    AND s.user_Id` = '" 
                         . mysqli_real_escape_string($con, $user_Id) 
                         ."'"
               )";

原始查询似乎容易受到SQL注入的攻击;示例查询演示了使用mysqli_real_escape_string函数来"转义"不安全的值,并使它们可以安全地包含在SQL文本中。(只有当你使用mysqli接口时,这个函数才合适。使用带有绑定占位符的prepared语句是另一种方法。