Php 通过链接来自另一个表的外键查询来访问Mysql数据库中的行
我很难找到从表格中获得结果的最佳方法。我希望一个使用主键从表中获取目标行,另一个使用外键 表的设置与此类似(减去许多其他空间属性): 逻辑流程是:用户Id由会话变量提供。查询数据库表“user”以查找该用户。转到用户类型以确定用户是个人还是场地。假设用户是场馆,转到DB表“场馆”并使用用户表中唯一/索引场馆Id中的外键查询表进行评级 这个查询看起来像Php 通过链接来自另一个表的外键查询来访问Mysql数据库中的行,php,mysql,database,Php,Mysql,Database,我很难找到从表格中获得结果的最佳方法。我希望一个使用主键从表中获取目标行,另一个使用外键 表的设置与此类似(减去许多其他空间属性): 逻辑流程是:用户Id由会话变量提供。查询数据库表“user”以查找该用户。转到用户类型以确定用户是个人还是场地。假设用户是场馆,转到DB表“场馆”并使用用户表中唯一/索引场馆Id中的外键查询表进行评级 这个查询看起来像 SELECT rating FROM `venue` WHERE `user_Id` = '$user_Id' AND `type` = 'ven
SELECT rating FROM `venue` WHERE `user_Id` = '$user_Id' AND `type` = 'venue'
这可能吗?如果可能,正确的方法是什么?您有几种方法来检索此信息 使用联接:
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'
在子查询中使用
SELECT rating
FROM venue
WHERE venue_id IN (SELECT venue_id FROM user
WHERE `user_Id` = '$user_Id' AND `type` = 'venue')
BTW,你应该考虑保护你的代码从
你有几种方法来检索这个信息。
使用联接:
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'
在
子查询中使用
SELECT rating
FROM venue
WHERE venue_id IN (SELECT venue_id FROM user
WHERE `user_Id` = '$user_Id' AND `type` = 'venue')
BTW,你应该考虑保护你的代码,从
它有点不清楚你是怎么解释的。
从我得到的,有2个表用户和地点。
在用户表中,您有:用户id、场馆id、名称、类型。
在场馆表中,您有:场馆id、等级
当您使用存储在user表中的user\u id和type中的WHERE子句时,您希望获得评级(vention表)
您的查询:
从用户标识为“$user\U Id”且类型为“场馆”的场馆中选择分级
不可能像上面那样完成,因为您是从场馆表中选择的,而用户id和类型不是从场馆表中选择的。所以即使你把FK锁上了,也会让它无法辨认。因为FK将只显示并对父子表进行一些约束
查询应该是这样的:
在v.venture\u id=u.venture\u id上从vention v JOIN user u选择评级,其中u.user\u id='$user\u id'和u.type='venture'
如果我错了,请纠正我。你那样解释有点不清楚。
从我得到的,有2个表用户和地点。
在用户表中,您有:用户id、场馆id、名称、类型。
在场馆表中,您有:场馆id、等级
当您使用存储在user表中的user\u id和type中的WHERE子句时,您希望获得评级(vention表)
您的查询:
从用户标识为“$user\U Id”且类型为“场馆”的场馆中选择分级
不可能像上面那样完成,因为您是从场馆表中选择的,而用户id和类型不是从场馆表中选择的。所以即使你把FK锁上了,也会让它无法辨认。因为FK将只显示并对父子表进行一些约束
查询应该是这样的:
在v.venture\u id=u.venture\u id上从vention v JOIN user u选择评级,其中u.user\u id='$user\u id'和u.type='venture'
如果我错了,请纠正我。根据具有相等值的列的表组合两个表中的行被称为相等联接操作,这是我们通常用于“遵循”外键关系的模式
例如:
$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\u real\u escape\u string
函数“转义”不安全的值,并使它们安全地包含在SQL文本中。(仅当您使用mysqli接口时,该函数才适用。使用带绑定占位符的准备语句是另一种方法。基于具有相等值列的表组合两个表中的行被称为相等连接操作,这是我们通常使用的“遵循”模式外键关系
例如:
$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\u real\u escape\u string
函数“转义”不安全的值,并使它们安全地包含在SQL文本中。(只有在使用mysqli界面时,该函数才适用。使用带绑定占位符的准备语句是另一种方法。@spencer7593尝试加入用户表和地点table@spencer7593尝试加入用户表和场馆表+1。(我的首选是所有符合条件的列引用,包括选择列表中的列,即select v.rating
。这对查询没有任何直接影响;但有一些好处:1)阅读SQL的人会知道(无需查看表定义)哪个表是列的源。2)稍后,当名为rating
的列添加到user
表中时,此查询将继续工作,而不是抛出“不明确的列”错误。+1。(我的首选是所有符合条件的列引用,包括选择列表中的列,即select v.rating
。这对查询没有任何直接影响;但有一些好处:1)阅读SQL的人会知道(无需查看表定义)哪个表是列的源。2)稍后,当名为rating
的列添加到user
表中时,此查询将继续工作,而不是抛出“不明确的列”错误。