php - 在while循环中使用JOIN sql查询

时间:2014-08-25 14:27:32

标签: php mysql sql join while-loop

我有这个问题:

    $r = $dbh->prepare("
            SELECT ur.user, urs.*
            FROM xeon_users_rented as ur 
              JOIN xeon_users_rented_stats as urs ON ur.user_by=urs.urs_user 
            WHERE ur.user_by=:user 
            "
    );
    $r->bindParam(':user', $userdata['username']);
    $r->execute();

我正在循环:

while($referralData=$r->fetch()):

echo $referralData['id'];

endwhile;

我的问题是,循环没有运行。如果我在循环中放置任何内容,是否未显示。

原始查询(没有JOIN)如下所示:

$r = $dbh->prepare("SELECT * FROM xeon_users_rented WHERE user_by=:user");

有什么问题?

1 个答案:

答案 0 :(得分:2)

您的用户需要存在于两个表中。

当您在xeon_users_rented上加入xeon_users_rented_statsur.user_by=urs.urs_user时,这意味着您将在ur.user_by=urs.urs_user时合并两个表中的行。因此组合的行将具有相同的用户。由于您的用户只存在于1个表中,因此在加入时,xeon_users_rented中与您的用户相关的行无法在另一个表中找到要合并的行,因为另一个表没有该用户。

例如:

表A

user      age
------------------
john      20
ricky     24
paul      30

表B

user      someStat
------------------
john      100
paul      200
paul      300

如果我们在TableA.user = TableB.user上将TableA与TableB连接起来,我们就会得到

TableA.user     TableA.age    TableB.user    TableB.someStat
---------------------------------------------------------------
john            20            john           100
paul            30            paul           200
paul            30            paul           300

对于TableA中的每一行,它将查找TableB中具有相同用户的所有行,并组合结果表中的行。由于Ricky不在表B中,他不在结果中。

现在,如果我们执行LEFT JOIN,这将保证连接左侧表格的所有行(在本例中为TableA),并在可用的右侧填写数据。

TableA.user     TableA.age    TableB.user    TableB.someStat
--------------------------------------------------------------
john            20            john           100
ricky           24            NULL           NULL
paul            30            paul           200
paul            30            paul           300

现在结果包括Ricky,但由于Ricky不在TableB中,因此TableB对应的列填充了NULL