我有这个问题:
$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");
有什么问题?
答案 0 :(得分:2)
您的用户需要存在于两个表中。
当您在xeon_users_rented
上加入xeon_users_rented_stats
和ur.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