【问题标题】:How can i run these queries so they will stop once a result is found我如何运行这些查询,以便一旦找到结果它们就会停止
【发布时间】:2019-02-07 19:55:31
【问题描述】:

我正在尝试使用以下查询从一个表中提取数据,但我需要它运行第一个查询并在它得到结果时停止,然后在没有结果时运行第二个查询。每次运行搜索时,我都会得到两个结果,但两个结果之一是回显没有结果。我还计划添加更多查询,以便可以根据需要返回结果。我已经在这个问题上工作了几天,最后我想我会寻求帮助。提前致谢。

$conn = new mysqli("localhost", "user", "password", "dbname");                                                                               
if(!$conn) {                                                                                                                                              
    die("Connection failed: " . mysqli_connect_error());                                                                                                  
}                                                                                                                                                         

//echo $conn->host_info . "\n";                                                                                                                           

$sql = "SELECT * FROM SCANMSTR WHERE BadgeNumber LIKE $query AND Active = 1 AND ExpirationDate >= curdate()";                                             
$result = mysqli_query($conn, $sql);                                                                                                                      

if (mysqli_num_rows($result) > 0) {                                                                                                                       
   while($row = mysqli_fetch_assoc($result)) {                                                                                                            
        echo "Badge Number: " .$row["BadgeNumber"]. "- Name: " . $row["BadgeName"]. "<br>";                                                               
     }                                                                                                                                                    
}                                                                                                                                                         

else  {                                                                                                                                                   
  echo "Not in system1";                                                                                                                                  
}                                                                                                                                                         


$sql1 = "SELECT * FROM SCANMSTR WHERE BadgeNumber LIKE $query and Active = 0 AND Barred = 1 AND Lost = 1";                                                
$result1 = mysqli_query($conn, $sql1);                                                                                                                    

if (mysqli_num_rows($result1) >0) {                                                                                                                       
   while($row1 = mysqli_fetch_assoc($result1)) {                                                                                                          
        echo "Card not active";  }                                                                                                                        
      }                                                                                                                                                   

else {                                                                                                                                                    
   echo "Not in system";

//新添加的代码

$row = mysqli_fetch_assoc($result);
如果($行){
if ($row['Active']) {
echo "徽章编号:" .$row["徽章编号"]。 "- 名称:".$row["BadgeName"]。 "
";
}
其他{
echo "卡无效";
}
如果($行){
if($row['禁止'])
echo "持卡人被禁止";
}
如果($行){
if($row['Lost'])
echo "卡报丢失";
}
}
其他{
echo "不在系统中";

【问题讨论】:

  • 将您的第二个移动到您的第一个的ELSE?在您的else 中设置一个变量并在运行第二个语句之前检查该变量?只提交一个 SQL 语句作为两个 sql 语句的 UNION?
  • 我已经尝试过了,它给了我一个空白页面。它不喜欢它。我还没有尝试过联合,虽然我不知道你可以用同一张桌子联合。我会看看它是否有效。谢谢
  • 应该没问题。唯一的约束是列数和列类型在两个结果集之间匹配。 UNION 的好处是它只需访问数据库一次。
  • @JNevill 我添加了一个工会,但没有运气。我删除了标签 $sql 和 $sql1 在两个查询之间添加了 UNION [ALL]。
  • @JNevill 感谢 UNION 的工作,感谢 Torbjorn Stabo 向我展示了正确的语法和位置。

标签: php mysqli


【解决方案1】:

您也许可以将两个查询放在一个中,只获取找到的第一行?像这样的:

$sql = "SELECT BadgeNumber, BadgeName, Active FROM SCANMSTR WHERE BadgeNumber LIKE $query AND Active = 1 AND ExpirationDate >= CURDATE()
        UNION
        SELECT BadgeNumber, BadgeName, Active FROM SCANMSTR WHERE BadgeNumber LIKE $query and Active = 0 AND Barred = 1 AND Lost = 1
        LIMIT 1";

$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);
if ($row) {
    if ($row['Active']) {
        echo "Badge Number: " .$row["BadgeNumber"]. "- Name: " . $row["BadgeName"]. "<br>";
    }
    else {
        echo "Card not active";  
    }
}
else {
    echo "Not in system";
}

编辑要将其扩展到 N 个检查,您可以添加更多

UNION
SELECT ...

$sql 的行,例如

$sql = "SELECT BadgeNumber, BadgeName, Active FROM SCANMSTR WHERE BadgeNumber LIKE $query AND Active = 1 AND ExpirationDate >= CURDATE()
        UNION
        SELECT BadgeNumber, BadgeName, Active FROM SCANMSTR WHERE BadgeNumber LIKE $query and Active = 0 AND Barred = 1 AND Lost = 1
        UNION
        SELECT ...
        UNION
        SELECT ...
        ...
        LIMIT 1";    

由于 LIMIT 1,查询将根据需要检查尽可能多的 SELECT 查询以返回一行。因此,即使多个 SELECT 匹配该人(不确定是否/应该可能?)你会得到第一个,而不是全部。

或者您可以简单地获取所有检查所需的列,然后在您的后端逻辑中执行它们:

$sql = "SELECT BadgeNumber, BadgeName, Active, ExpirationDate 
        FROM SCANMSTR 
        WHERE BadgeNumber LIKE $query
        LIMIT 1";

$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);
if ($row) {
    if ($row['Active']) {
        echo "Badge Number: " .$row["BadgeNumber"]. "- Name: " . $row["BadgeName"]. "<br>";
    }
    else if ($row['ExpirationDate'] < date('Y-m-d')) {
        echo "Card not active";
    }
}
else {
    echo "Not in system";
}

我个人认为我会这样做,感觉更干净,更少重复的 SQL 等。不过,两种方式都应该有效:)..

【讨论】:

  • 做到了,我试图让语法正确,而您的回复向我展示了我做错了什么。您认为这可以进一步修改以添加另外两个查询吗?再次感谢。
  • @ventron 很高兴听到:)!我不是 100% 确定我理解正确,但是是的,如果您正在寻找更多条件,例如“卡未激活”,我想它应该可以工作。当然,只要您知道“优先链”。 ($sql 查询只会获取 first 条件匹配的数据,对吧?)
  • 我玩过它,在我添加了其他 SELECT 语句之后,如果你给了我,我会在最初的情况下添加一些 if 语句,我可以提取我需要的东西。重复次数更多,但如果卡处于活动状态但丢失,或者由于丢失状态而不处于活动状态,它会拉动。我将尝试编辑我的代码,以便您查看。再次感谢你真的帮了很多忙。这让我头疼了好几天。
【解决方案2】:

您将第二个语句放入第一个语句的第一个 ELSE 中,如下所示:

$conn = new mysqli("localhost", "user", "password", "dbname");
if(!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

//echo $conn->host_info . "\n";

$sql = "SELECT * FROM SCANMSTR WHERE BadgeNumber LIKE $query AND Active = 1 AND ExpirationDate >= curdate()";
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
   while($row = mysqli_fetch_assoc($result)) {
        echo "Badge Number: " .$row["BadgeNumber"]. "- Name: " . $row["BadgeName"]. "<br>";
     }
}

else  {                                                                                                                                                   
$sql1 = "SELECT * FROM SCANMSTR WHERE BadgeNumber LIKE $query and Active = 0 AND Barred = 1 AND Lost = 1";
$result1 = mysqli_query($conn, $sql1);

if (mysqli_num_rows($result1) >0) {
   while($row1 = mysqli_fetch_assoc($result1)) {
        echo "Card not active";  }
      }

else {
   echo "Not in system";}

 }

【讨论】:

  • 我试了一下,但没有得到任何结果。谢谢
猜你喜欢
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 2020-07-27
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多