MySQL我需要使用什么类型的查询


MySQL what kind of query i need to use

我正在制作一个面板,在那里我可以管理我的用户,我想显示用户名、电子邮件,我想展示下了多少订单。在我的数据库中,我有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>

我想我应该使用内部联接,但我怎么能做到呢?

Greetz

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

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

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

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>
    ";
}