0

我正在处理一个表格,其中将从数据库中挑选来自用户的数据。

问题是我无法在我的 while 条件下放置两个语句,因为我从不同的表和行获取数据。

@代码

<?php
$con = mysql_connect("localhost", "username", "password") or die(mysql_error());
mysql_select_db("database_name") or die(mysql_error());

$result = mysql_query("select * FROM users");

$space_used = mysql_query("SELECT SUM(fileSize) FROM file WHERE file.userId=users.id AND file.statusId=1");

$total_files = mysql_query("SELECT COUNT(id) FROM file WHERE file.userId=users.id AND file.statusId=1");

echo "<table class='table table-striped table-hover table-bordered' id='sample_editable_1'>
<tr>
    <th>Username</th>
    <th>Type</th>                                   
    <th>Email</th>
    <th>Last Login</th>
    <th>Last IP</th>
    <th>space_used</th>
    <th>total_files</th>
    <th>status</th>
</tr>";

while($row = mysql_fetch_array($result))
{
    echo "<tr>";
        echo "<td>" . $row['username'] . "</td>";
        echo "<td>" . $row['level'] . "</td>";
        echo "<td>" . $row['email'] . "</td>";
        echo "<td>" . $row['lastlogindate'] . "</td>";
        echo "<td>" . $row['lastloginip'] . "</td>";
        echo "<td>" . $space_used['space_used'] . "</td>";
        echo "<td>" . $total_files['total_files'] . "</td>";
        echo "<td>" . $row['status'] . "</td>";
    echo "</tr>";
}

echo "</table>";
mysql_close($con);
?>

我得到的是用户名、级别、电子邮件、lastlogindate、lastloginip 和状态的所有值。我的桌子上没有显示的两个是我要实现的第二个条件:space_used 和 total_files。

我究竟做错了什么?我不是 php 方面的专家,而且我混合了教程和脚本来获得这个结果,这一事实有点复杂。

谢谢

4

4 回答 4

1

您想要聚合每个 userId。

将这两个查询拉入 while 循环。使用检索到的用户id进行聚合查询。

while($row = mysql_fetch_array($result))
{
    $space_used = mysql_query("SELECT SUM(fileSize) FROM file WHERE file.userId={$row['id']} AND file.statusId=1");
    $total_files = mysql_query("SELECT COUNT(id) FROM file WHERE file.userId={$row['id']} AND file.statusId=1");
    ...
 }

将它们组合成一个查询。

$agragateDataResponce = mysql_query("SELECT SUM(fileSize) as size,
                                            COUNT(id) as count 
                                       FROM file 
                                      WHERE file.userId={$row['id']} AND 
                                            file.statusId=1");
$agragateData = mysql_fetch_array($agragateDataResponce);

通过$agragateData['size']访问$agragateData['count']

然后查找如何将剩余的两个 SQL 组合成一个连接 :) 。SO关于主题的问题

于 2013-08-19T22:15:02.527 回答
1

您需要重新处理查询,您可以使用以下命令将 3 个查询恢复为一个查询JOIN

  SELECT u.*, 
         SUM(f.fileSize) AS space_used, 
         COUNT(f.id) AS total_files
    FROM users u
    JOIN file f 
      ON f.userId = u.id AND f.statusId = 1
GROUP BY u.id

然后你可以这样读:

<?php
// your database info
$db_host = 'your MySQL server host';
$db_user = 'your username';
$db_pass = 'your password';
$db_name = 'your database name';
$con = new mysqli($db_host, $db_user, $db_pass, $db_name);
if($con->connect_error)
{
        die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
}

if (!$result = $con->query("SELECT u.*,
                                   SUM(f.fileSize) AS space_used, 
                                   COUNT(f.id) AS total_files
                              FROM users u
                              JOIN file f 
                                ON f.userId = u.id AND f.statusId = 1
                          GROUP BY u.id"))
{
    die('Select query error: ' . $con->error);
}
?>
<table class='table table-striped table-hover table-bordered' id='sample_editable_1'>
    <tr>
        <th>Username</th>
        <th>Type</th>                                   
        <th>Email</th>
        <th>Last Login</th>
        <th>Last IP</th>
        <th>space_used</th>
        <th>total_files</th>
        <th>status</th>
    </tr>
<?php
while ($row = $result->fetch_array())
{
?>
    <tr>
        <td><?php echo $row['username']; ?></td>
        <td><?php echo $row['level']; ?></td>
        <td><?php echo $row['email']; ?></td>
        <td><?php echo $row['lastlogindate']; ?></td>
        <td><?php echo $row['lastloginip']; ?></td>
        <td><?php echo $row['space_used']; ?></td>
        <td><?php echo $row['total_files']; ?></td>
        <td><?php echo $row['status']; ?></td>
    </tr>
<?php
}
$con->close();
?>
</table>
于 2013-08-19T22:16:11.620 回答
0

尝试使用

$space_used = mysql_query("SELECT SUM(fileSize) 
                             FROM file 
                            WHERE file.userId=users.id AND 
                                  file.statusId=1");

$total_files = mysql_query("SELECT COUNT(id) 
                              FROM file 
                             WHERE file.userId=users.id AND 
                                   file.statusId=1");

上面的行里面While并用user.id

我是stackoverflow的新手,所以不要我的。我不知道如何让代码看起来像每个人一样

于 2013-08-19T22:20:25.847 回答
0

首先查询数据库并将结果保存到变量中。

$result = mysql_query("select * FROM users");
$space_used = mysql_query("SELECT SUM(fileSize) FROM file WHERE file.userId=users.id AND file.statusId=1");
$total_files = mysql_query("SELECT COUNT(id) FROM file WHERE file.userId=users.id AND file.statusId=1");

然后你遍历你的第一个结果

while($row = mysql_fetch_array($result))

请注意您对mysql_fetch_array. 您永远不会调用mysql_fetch_array其他两个结果。

有关更多详细信息,请参阅PHP 文档。mysql_query具体来说,返回类型是resource

返回的结果资源应该传递给 mysql_fetch_array() 和其他处理结果表的函数,以访问返回的数据。

然而,

SELECT SUM(fileSize) FROM file WHERE file.userId=users.id AND file.statusId=1

甚至不是你想要的。您检查file.userId=users.id但仅从file表中读取。您缺少用户源表。

于 2013-08-19T22:02:54.520 回答