如果结果为空,则调用第二个查询

时间:2015-12-11 18:15:23

标签: php mysql

我正在调用一个INNER JOIN查询来显示用户的结果,如果他们在表1和表1中都有信息的话。 2 - 这很好用。但是,如果所述用户在两个表中都没有信息,那么我的变量将返回undefined。

所以我想调用我的INNER JOIN查询,如果Table1的行为空,它将调用第二个查询来显示Table2的结果。

(表2肯定存储了信息。表1是可选的,具体取决于用户)

我还希望显示表1和表1中的结果。 2如果另一个用户都有信息,我似乎无法让它工作。这是我到目前为止所拥有的;

$sql="SELECT * FROM Table1 INNER JOIN Table2 ON Table1.username = Table2.username WHERE Table1.username='" . $_SESSION['username']['1'] . "'";

$result=MySQL_Query($sql);
if (mysql_num_rows($result)==0)
{ 
    $sql2"SELECT * FROM Table2 WHERE username='" . $_SESSION['username']['1'] . "'";
    $result2=MySQL_Query($sql2);
}

while ($rows=mysql_fetch_array($result)($result2))
{
    $Username = $rows['username'] ." ";
    $Email = $rows['email'] . " ";
}

echo $Email; ?>

2 个答案:

答案 0 :(得分:0)

您可以使用外部联接重写查询,如下所示:

select
    t1.desired_info
    t2.desired_info
from
    table2 as t2
        left outer join
    table1 as t1
        on (t2.username = t1.username)
where
    t2.username = target_username;

where子句将结果集缩小到感兴趣的用户,如果target_username不存在则返回0行。 t2.desired_info将始终返回,而如果该用户不在该表中,则t1.desired_info将为null。

您可以先检查php代码中的p1.desired_info,如果没有,请使用p2.desired。

答案 1 :(得分:0)

回应建议使用 OUTER JOIN ,它将左表中的所有选定行连接到右侧的匹配行,如果右侧没有匹配的行,则连接到空行。

此外,我已经重写了使用 PDO 和准备好的声明,以向您展示其完成情况。变量$dbhost$dbname$dbuserdbpassword中的值由您的代码提供。

<?php
    $dsn = "mysql:host=$dbhost;dbname=$dbname";
    $dbh = new PDO($dsn, $dbuser, $dbpassword);

    $sql = "SELECT *
              FROM table2 t1
              LEFT JOIN table1 t1 ON t1.username = t2.username
              WHERE t2.username = :username";

    // prepare() parses and compiles the query. Syntax error come out here.
    $stmt = $dbh->prepare($sql);
    // bindValue() handles quoting, escaping, type-matching and all that crap for you.
    $stmt->bindValue(':username', $_SESSION['username']['1']);
    $stmt->execute();
    while ($row = $stmt->fetch(PDO::FETCH_BOTH))
    {
        $Username = $rows['username'] ." ";
        $Email = $rows['email'] . " ";
        // and then do something useful with them
    }

在此处使用准备好的陈述可以提供针对SQL injection attacks的重要保护措施。像往常一样,我将错误处理留给读者练习。