【问题标题】:SQL SUM() different table different columnsSQL SUM() 不同表不同列
【发布时间】:2016-02-17 14:40:15
【问题描述】:

分类表

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

元表

mysql> SELECT * FROM meta;
+------+------+----------+-------------+-------+
| m_id | c_id | name     | description | costs |
+------+------+----------+-------------+-------+
|    1 |    1 | Abhijit1 | description | 100   |
|    2 |    1 | Abhijit2 | description | 200   |
|    3 |    2 | Abhijit3 | description | 500   |
|    4 |    3 | Abhijit4 | description | 800   |
+------+------+----------+-------------+-------+

meta 和cats 表的共同点是c_id 元表猫 c_id(1) 元表有 2 (Abhijit1,Abhijit2) 行与 m_id(1,2)

交易表

mysql> SELECT * FROM transactions;
+------+------+------------+--------+
| t_id | m_id | date       | amount |
+------+------+------------+--------+
|    1 |    1 | 2016-02-01 | 50     |
|    2 |    1 | 2016-02-06 | 50     |
|    3 |    3 | 2016-02-15 | 400    |
|    4 |    4 | 2016-02-19 | 150    |
+------+------+------------+--------+

事务和元表的共同点是 m_id m_id 1 的事务有 2 行 t_id(1,2) 此表主要是支付金额和日期

我想 sum() 每个类别的所有成本(来自元表)和金额(来自交易表)。

表连接

cats.c_id
    |
    |-----> meta.c_id
    |-----> meta.m_id
                |-----> transactions.m_id

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

I Want Get Return From Query Like This:
+------+-----------+--------------+---------------+
| c_id | c_name    | SUM(m.costs) | SUM(t.amount) |
+------+-----------+--------------+---------------+
|    1 | cats 1    |          300 |           100 |
|    2 | cats 2    |          500 |           400 |
|    3 | cats 3    |          800 |           150 |
+------+-----------+--------------+---------------+

这里 SUM(m.costs) 都是针对某个类别的成本,而 SUM(t.amount) 都是针对某个类别支付的

请帮助我或任何更好的表管理想法。

【问题讨论】:

  • 而您当前的查询是....?
  • 您的问题令人困惑“猫 id 1 的成本是 300,但在这里我得到了 400”猫 id 表示 m.costs 和 t.amount 为 300。为什么说是400?提供的数据不应该是 t.amount 的总和为 100?
  • 类别 1 的 SUM(t.amount) 不应该是 100 (50+50) 吗?

标签: php mysql sql database pdo


【解决方案1】:

问题出在您加入transactions 以获得SUM(t.amount) 的事实。因此,如果单个 meta 记录与两个 transactions 记录相关联,则 costs 值会被计算两次。

您可以使用相关子查询来计算SUM(t.amount) 来解决这个问题:

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

输出:

c_id c_name  SUM(m.costs)   SUM(t.amount) 
-----------------------------------------
1    cats 1  300            100
2    cats 2  500            400
3    cats 3  800            150

Demo here

【讨论】:

  • 非常感谢您的回答
  • 你能告诉我学习 mysql 的最佳方法吗? php。 javascript
  • 任何书籍教程。请你能告诉我如何更深入地学习编程。再次感谢
  • @ABHIJIT 学习编程的最佳方式是实践、编写实际程序、构建实际应用程序。你也可以在这里学到很多东西。检查 this 预订 Javascript 和 JQuery。
【解决方案2】:

试试这个

SELECT cats.c_id,
       cats.c_name,
       (SELECT SUM(m.cost) FROM meta WHERE cats.c_id = m.c_id) AS cost,
      (SELECT SUM(t.cost) FROM meta WHERE t.id = m.id) AS amount
WHERE c.c_id = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-13
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多