来自第二个表的 MySQL INNER JOIN (TOP10)

Posted

技术标签:

【中文标题】来自第二个表的 MySQL INNER JOIN (TOP10)【英文标题】:MySQL INNER JOIN from second table (TOP10) 【发布时间】:2015-02-14 05:39:46 【问题描述】:
$stmt = $conn->prepare('选择 a.*, c.*, SUM(a.money+b.RESULT) 作为结果
来自用户
    INNER JOIN 银行账户 c
        ON a.id = c.owner
    内部联接
    (
        选择所有者,总和(金额)作为结果
        从银行账户
        按所有者分组
    ) b ON a.id = b.owner
    ORDER BY ARESULT DESC LIMIT 10');

什么问题,它只显示错误的一条记录?我想列出最多 10 条记录 - 比如拥有 [money+(all his bankaccounts amount)] 的 TOP 10 最富有的人

假设.. 我有 2 张桌子。

表:用户

ID | username | money

1  | richman | 500

2  | richman2 | 600

表格:银行账户

ID | owner | amount

65 | 1     | 50

68 | 1     | 50

29 | 2     | 400

所以它会列出:

    richman2 1000$

    富豪600美元

【问题讨论】:

【参考方案1】:

试试这个:

SELECT  a.*, (a.money + b.RESULT) AS ARESULT
FROM users a 
INNER JOIN (SELECT owner, SUM(amount) AS RESULT
            FROM bankaccounts
            GROUP BY owner
          ) b ON a.id = b.owner
ORDER BY ARESULT DESC 
LIMIT 10

【讨论】:

【参考方案2】:

尝试使用子查询...

$stmt = $conn->prepare('SELECT  a.*, 
    IFNULL((SELECT SUM(amount) FROM bankaccounts b WHERE b.owner=a.id),0) AS BANK_MONEY,
    (IFNULL(a.money,0) + IFNULL((SELECT SUM(amount) FROM bankaccounts c WHERE c.owner=a.id),0)) AS ARESULT
    FROM users a 
    ORDER BY ARESULT DESC LIMIT 0, 10');

编辑:为银行账户总额添加了一个字段

EDIT2:在 SQL 语句中添加 IFNULL,以防用户不在 BankAccounts 表中

【讨论】:

感谢您的回复,但还是有问题。 link 这是因为如果用户不在银行帐户表中,则不会显示。现在就试试。我在 SQL 语句中添加了 IFNULL 函数来处理这个问题。

以上是关于来自第二个表的 MySQL INNER JOIN (TOP10)的主要内容,如果未能解决你的问题,请参考以下文章

使用 INNER JOIN 排除 MYSQL 查询结果

LEFT JOIN,如果存在第二个表的结果,则添加到 PHP 中的数组

多表查询-inner join left join right joinfull join

MySQL JOIN 2 个表并分别获取两个表的总和

SQL语句(inner join,left out join,right out join三者的不同

MySql INNER JOIN三表联查性能如何提升