php - Sql sum() 来自不同表的列

标签 php mysql sql database

类别表

mysql> SELECT * FROM cats;
+------+------+-----------+
| c_id | p_id | c_name    |
+------+------+-----------+
|    1 |    1 | cats 1    |
|    2 |    1 | cats 2    |
|    3 |    1 | cats 3    |
+------+------+-----------+

元表

mysql> SELECT * FROM meta;
+------+------+------+---------+-------------+-------+
| m_id | p_id | c_id | name    | description | costs |
+------+------+------+---------+-------------+-------+
|    1 |    1 |    1 | Abhijit | description | 100   |
|    2 |    1 |    1 | Abhijit | description | 200   |
|    3 |    1 |    2 | Abhiji2 | description | 500   |
+------+------+------+---------+-------------+-------+

交易表

mysql> SELECT * FROM transactions;
+------+------+------+---------------------+--------+
| t_id | p_id | m_id | date                | amount |
+------+------+------+---------------------+--------+
|    1 |    1 |    1 | 2016-02-16 11:17:06 | 50     |
|    2 |    1 |    1 | 2016-02-16 11:17:06 | 50     |
|    3 |    1 |    2 | 2016-02-16 11:17:06 | 50     |
|    4 |    1 |    2 | 2016-02-16 11:17:06 | 150    |
+------+------+------+---------------------+--------+

我想对每个类别成本(来自元表)和金额(来自交易表)求和。

我使用:

mysql> SELECT c.*, SUM(t.amount), SUM(m.costs)
    FROM cats c
        LEFT JOIN meta m ON m.c_id=c.c_id
        LEFT JOIN transactions t ON t.m_id=m.m_id
    GROUP BY c.c_id;

+------+------+-----------+--------+---------------+--------------+
| c_id | p_id | c_name    | add_by | SUM(t.amount) | SUM(m.costs) |
+------+------+-----------+--------+---------------+--------------+
|    1 |    1 | Abhijit   |      1 |           100 |          400 |
|    2 |    1 | Abhiji2   |      1 |           200 |          500 |
+------+------+-----------+--------+---------------+--------------+

这是错误的。 ID 1 的猫的成本是 300,但这里我得到 400

我想从这样的查询中获得返回:

+------+------+-----------+--------+---------------+--------------+
| c_id | p_id | c_name    | add_by | SUM(t.amount) | SUM(m.costs) |
+------+------+-----------+--------+---------------+--------------+
|    1 |    1 | Abhijit   |      1 |           100 |          300 |
|    2 |    1 | Abhiji2   |      1 |           200 |          500 |
+------+------+-----------+--------+---------------+--------------+

最佳答案

我认为您的 JOIN 条件之一存在拼写错误(或错误)。我认为您最初的查询是这样的:

SELECT c.*, SUM(t.amount), SUM(m.costs)
FROM cats c
    LEFT JOIN meta m ON m.c_id = c.c_id
    LEFT JOIN transactions t ON t.m_id = m.c_id
GROUP BY c.c_id;

仔细注意ON t.m_id = m.c_id,这与您的预期输出一致。无论如何,我对您的查询进行了如下修改:

SELECT c.c_id, c.p_id, c.c_name, t2.transactionCosts, t1.metaCosts
FROM cats c
LEFT JOIN
(
    SELECT c_id, SUM(costs) AS metaCosts
    FROM meta
    GROUP BY c_id
) t1
    ON c.c_id = t1.c_id
LEFT JOIN
(
    SELECT m_id, SUM(amount) AS transactionCosts
    FROM transactions
    GROUP BY m_id
) t2
    ON c.c_id = t2.m_id
WHERE t2.transactionCosts IS NOT NULL OR t1.metaCosts IS NOT NULL;

第一个子查询计算每个 c_id 的元总计,第二个子查询计算每个 m_id 的交易总计。然后将这些结果与 cats 表连接在一起以获得最终结果。

点击下面的链接即可运行演示:

SQLFiddle

关于php - Sql sum() 来自不同表的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35424640/

相关文章:

mysql - SQL JOIN 两个表与 AVG

php - json_decode, foreach 只从 json 字符串返回一行

java - 防止Java程序中的SQL注入(inject)攻击

php - 将数组插入数据库

php - Redis sub/pub 和 php/nodejs

sql - 如何在 SQL 查询中应用特定格式的出生日期?

php - 使用 php/MySQL 的定时事件

phpinfo() 不工作它显示空白页但其他 php 工作

php - 如何用JS和PHP实现HMAC

php - 如何在不中断用户访问的情况下每月刷新大型数据库表