首页 > 解决方案 > 在查询中进行另一个查询时仅显示一行

问题描述

我的网站上有一个好友列表,我将用户名存储在数据库中,而不是他们的全名。所以我只是在朋友列表中进行另一个查询......

while($r = mysqli_fetch_array($result)) {
    $username = $r['username'];
    // Wanna find the real name
    $sql = "SELECT * FROM users WHERE username = '$username'";
    $result = mysqli_query($con, $sql);
    $row = mysqli_fetch_array($result);
    $fullname = $row['fullname'];
    echo $fullname;
}

它工作正常,但它只显示一行,而不是所有行。当我只显示用户名时,它会显示所有行。

标签: phphtmlmysqlsql

解决方案


这里有很多问题,但归结为进行所谓的N+1查询。您执行一个查询以获取N行,然后再执行N个查询,每行一个,以检索其他详细信息。

您可以使用以下命令一次性完成所有操作JOIN

SELECT x, users.username FROM y WHERE (x conditions)
  LEFT JOIN users ON users.username=y.username

这样您就可以一次获取所有数据。值得注意的是,username像这样使用作为密钥通常会出现严重问题,因为您要么需要在一大堆级联触发条件中分层以跟踪引用完整性,要么根本没有任何引用完整性。尝试将数值用作数据库中的主键,并username仅将其用作人类的标签。

这里的风险是,如果有人删除了他们的帐户,而另一个人创建了一个名称完全相同的帐户,他们就会从前一个人那里“继承”这些朋友。这已经出现在大型网站上,并造成了大量麻烦,人们有效地获得了其他人放弃的内容的所有权。


推荐阅读