MySQL我需要使用什么样的查询

时间:2015-03-21 21:39:38

标签: php mysql

我正在创建一个面板,我可以管理我的用户,我想显示用户名,电子邮件,我想显示放置了多少订单。在我的数据库中,我有2个表1个用户,1个订单。我正在订单表中保存用户的用户名,所以我知道用户已经购买了它。

但是,我想在foreach循环中编写一个包含我的用户概述的面板。我有用户名循环,电子邮件如何我可以添加订单金额。

<?php
$model = $connection->createCommand('SELECT * FROM user');
$adminAccounts = $model->queryAll();
foreach($adminAccounts as $results){
        $accounts['id'] = $account_id;
        $accounts['username'] = $results['username'];
        $accounts['email'] = $results['email'];
        $accounts['rest'] = $results;
    echo "
        <tr>
            <td>
                <p>"  . $newValidation->safeEcho($accounts['username']) ." </p>
            </td>
            <td>
                <p>"  . $newValidation->safeEcho($accounts['email'])." </p>
            </td>
        </tr>
    ";
}   

让我们说我的桌子看起来像这样

<username> <email>

现在我希望它看起来像这样

 <username> <email> <total orders>

我在想我应该使用内连接,但我该怎么做呢?

格尔茨

1 个答案:

答案 0 :(得分:1)

我认为您可以将查询更改为:

SELECT user.*, t.cnt FROM user JOIN (SELECT gebruikersnaam, COUNT(*) AS cnt FROM orders GROUP BY gebruikersnaam) t ON user.username = t.gebruikersnaam

使用此查询,您可以获取用户订单,但是您将跳过没有订单的用户,因此要获得它们,您可以执行LEFT JOIN:

SELECT user.*, t.cnt FROM user LEFT JOIN (SELECT gebruikersnaam, COUNT(*) AS cnt FROM orders GROUP BY gebruikersnaam) t ON user.username = t.gebruikersnaam

我建议表顺序中用户的字段是用户名。在您的问题中,您指出该表是用户,但在您的查询表中是用户。我正在使用用户。如果您使用此更改更改当前查询,则可以添加代码:

foreach($adminAccounts as $results){
    $accounts['id'] = $account_id;
    $accounts['username'] = $results['username'];
    $accounts['email'] = $results['email'];
    $accounts['total_orders'] = ($results['cnt'] == NULL) ? 0 : $results['cnt']; // orders per user
    $accounts['rest'] = $results;
    echo "
        <tr>
            <td>
                <p>"  . $newValidation->safeEcho($accounts['username']) ." </p>
            </td>
            <td>
                <p>"  . $newValidation->safeEcho($accounts['email'])." </p>
            </td>
            <td>
                <p>"  . $newValidation->safeEcho($accounts['total_orders'])." </p>
            </td>

        </tr>
    ";
}