gpt4 book ai didi

mysql - 带条件的 SQL 连接表查找

转载 作者:行者123 更新时间:2023-11-29 07:53:48 24 4
gpt4 key购买 nike

我正在寻找连接两个表,条件是如果用户表的分支代码字段中有任何内容,那么 SQL 查询将只返回其分支代码。

但是,如果用户表的分支代码框中包含 NULL,它将返回分支表中的所有分支代码。

下面是我正在尝试的,我知道不起作用,但应该给出我正在使用的表格和字段的一些倾向。

SELECT IF(u.BranchCode IS NOT NULL THEN b.BranchCode ELSE u.BranchCode END ) AS BranchCode, b.BranchName, b.BranchAddress1, b.BranchAddress2
FROM users AS u
LEFT JOIN branches AS b ON u.BranchCode = b.BranchCode
WHERE u.Username = '$_SESSION[USERNAME]'

一些表格示例:

用户

UserName |  BranchCode
---------|------------------
bob | NULL
sam | AW3456
dave | NULL
alison | NULL
fred | NULL

分支机构

BranchCode| BranchName  |BranchAddress1 |BranchAddress2
----------|-------------|---------------|-------------------
AQ3459 | Northmore |1 Northmore Rd |Northmore Village
AW3456 | Middleton |28 Main Rd |Middleton Stoney
DE5689 | Western |451 Station Rd |Western
FR3278 | Easterly |12 Acacia Dr |Easterly Estate

例如,如果 bob 是登录用户,它将返回所有 BranchCode 信息:

BranchCode| BranchName  |BranchAddress1 |BranchAddress2
----------|-------------|---------------|-------------------
AQ3459 | Northmore |1 Northmore Rd |Northmore Village
AW3456 | Middleton |28 Main Rd |Middleton Stoney
DE5689 | Western |451 Station Rd |Western
FR3278 | Easterly |12 Acacia Dr |Easterly Estate

如果 sam 是登录的用户,它将仅返回其在用户表中指定的 BranchCode 信息的查找:

BranchCode| BranchName  |BranchAddress1 |BranchAddress2
----------|-------------|---------------|-------------------
AW3456 | Middleton |28 Main Rd |Middleton Stoney

最佳答案

也许更擅长 SQL 的人会以纯 SQL 方式回答这个问题,但我倾向于保持查询相当简单,因为我喜欢在编码中遵循 KISS 规则。我希望他们会这样做,因为这个答案并不能 100% 以您想要的方式回答您的问题。

根据您提供给我们的 SQL,我可以假设您使用 PHP 进行此查询。另外,从您的查询中可以看出您之前已调用过 users 表。在该调用中,将 BranchId 列存储在 session 中,就像使用用户名变量一样。

假设设置了$_SESSION['branchId'](即使它可能为NULL)并且您的mysqli_connect()调用存储在名为的变量中$con,然后你可以执行如下操作:

回答问题(但不是真的)

$sql = "SELECT * FROM branches";

if($_SESSION['branchId']!==null){
$sql.= " WHERE BranchCode='".mysqli_real_escape_string($con,$_SESSION['branchId'])."'";
}

$result = mysqli_query($con,$sql);
//Fetch rows as usual.

关于表结构的注释

如果您的表已有 ID 列,则可以忽略下一部分。

现在,我真的不确定为什么你的表是这样构造的。我知道每个分行在交谈时可能有一个字母数字调用号码(例如,如果您调用另一个分行,您会说“我是来自 AW2011 分行的 Jack,...”)但是 SQL Injection是真实的,对抗它的最好和最简单的方法之一是对引用变量进行类型转换,以便删除任何额外的输入。但是,这仅对整数类型的引用列有用,因为字符串列仍然需要转义。考虑到这一点,您会注意到我在branchId周围使用了mysqli_real_escape_string(),因为我知道它将是一个字符串值。

很多人会推荐像 Prepared Statements 这样的东西虽然我可能已经为您提供了它的链接,但有时它可能会非常令人困惑,而且我并不完全是 PHP 的 PDO 连接的忠实粉丝。 MySQLi 扩展还提供了自己的语句准备版本,这两个版本都没有立即让我感到惊讶。它们看起来都很复杂,我觉得没有必要这么复杂。但如果您需要使用字符串数据,它们绝对是避免 SQL 注入(inject)的最佳方法。

如果您的表没有更多引用,我无法确定您的数据实际上是什么样子,但我的逻辑是,如果您有 user_id 列,则不会传入 username 列。因此,我建议您创建的任何表上的每条记录都具有 ID 列。这简化了对 SQL 注入(inject)的防范,因为我可以将 if() 语句中的文本缩短为

,而不是长度 mysql_real_escape_string() 调用。
$sql .= 'WHERE branch_id='.(int)$_SESSION['branchId'];

在大多数情况下,这几乎就是您防范 SQL 注入(inject)所需的全部内容。如果有人要更改您的 session 数据(我确信这是可能的,尽管从未决定尝试),他们尝试输入的任何额外文本都将被删除或导致 SQL 运行不正确。 (不过,不要引用我的话。我很久以前读过有关 PHP 类型转换变量的内容,所以我可能完全错了)。

如果您不清楚 ID 列是什么或如何使用它,请随时提出另一个问题,希望有人比我更准确地向您解释。

关于mysql - 带条件的 SQL 连接表查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25659468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com