【问题标题】:php - using JOIN sql query in while loopphp - 在while循环中使用JOIN sql查询
【发布时间】:2014-10-18 17:41:10
【问题描述】:

我有这个问题:

    $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");

怎么了?

【问题讨论】:

  • 给我们做一个 var_dump($->fetch()) !
  • 您是否尝试过直接在数据库中运行查询以验证您是否获得了预期的结果?
  • @jeroen 未输入循环。 (编辑了我的问题,抱歉)
  • 如@MattBrowne 所述,直接在您的数据库中运行查询,查询可能没有返回任何内容。
  • 请查看我更新的问题。我已经包含了原始查询(没有 JOIN 功能)也许会有所帮助。

标签: php mysql sql join while-loop


【解决方案1】:

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

当您在ur.user_by=urs.urs_user 上加入xeon_users_rentedxeon_users_rented_stats 时,这意味着您将在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 不在 TableB 中,因此他不在结果中。

现在,如果我们执行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填充

【讨论】:

  • 如果用户在另一个表中不存在,我是否可以使用连接功能? (xeon_users_rented_stats) 仅在某些情况下存在。
  • 说它存在于rented,但不存在于rented_stats。您希望在结果中看到什么?
  • 我希望在循环中看到“租用”的记录。它存在于“rented_stats”中,然后我就可以使用这些记录了。
  • 尝试使用LEFT JOIN
  • 我对 JOIN 函数非常陌生,想举个例子吗?
猜你喜欢
  • 2013-10-27
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 2018-05-21
  • 2013-03-11
相关资源
最近更新 更多