【问题标题】:MySQL Views: polymorphic associations and child tablesMySQL 视图:多态关联和子表
【发布时间】:2018-03-28 16:37:22
【问题描述】:

当他们是供应商时,如何创建视图(producer_viewretailer_view)显示每个交易 SUM( unit_price * quantity ) 的总金额客户 ?

producer_view
+------+-------------------+-----------------+
| name | as_supplier_total | as_client_total |
+------+-------------------+-----------------+
| foo  |               144 |               9 |
| bar  |                 9 |             264 |
+------+-------------------+-----------------+

retailer_view
+------+-------------------+-----------------+
| name | as_supplier_total | as_client_total |
+------+-------------------+-----------------+
| baz  |                16 |             125 |
| qux  |               245 |              16 |
+------+-------------------+-----------------+

我的两个困难是:

  • 每个事务supplier_idclient_id存储在两个多态关联中,其中supplier_typeclient_type可以是@ 987654329@或App\Retailer

  • 每个事务unit_pricequantity都存储在一个子表中。

两个父表是:

Producer
+----+------+
| id | name |      
+----+------+
|  1 | foo  |     
|  2 | bar  |      
+----+------+

Retailer
+----+------+
| id | name |
+----+------+
|  1 | baz  |
|  2 | qux  |
+----+------+

交易中,生产者零售商都可以是供应商客户强>。

Transaction
+----+---------+-------------+---------------+-----------+--------------+
| id | product | supplier_id | supplier_type | client_id |  client_type |
+----+---------+-------------+---------------+-----------+--------------+
|  1 | a       |           1 |  App\Producer |         1 | App\Retailer |
|  2 | b       |           2 |  App\Retailer |         1 | App\Retailer |
|  3 | c       |           1 |  App\Producer |         2 | App\Producer |
|  4 | d       |           2 |  App\Retailer |         2 | App\Producer |
+----+---------+-------------+---------------+-----------+--------------+

每个交易的详细信息都记录在item表中:

Item
+----+----------------+------------+----------+
| id | transaction_id | unit_price | quantity |
+----+----------------+------------+----------+
|  1 |              1 |         10 |        1 |
|  2 |              1 |         20 |        1 |
|  3 |              2 |         30 |        1 |
|  4 |              2 |         40 |        1 |
|  5 |              3 |         50 |        1 |
|  6 |              3 |         60 |        1 |
|  7 |              4 |         70 |        1 |
|  8 |              4 |         80 |        1 |
|  9 |              5 |          2 |        2 |
| 10 |              6 |          3 |        3 |
| 11 |              7 |          4 |        4 |
| 12 |              8 |          5 |        5 |
+----+----------------+------------+----------+

来自以下经过验证的答案的 SQLFiddle:

【问题讨论】:

    标签: mysql views polymorphic-associations


    【解决方案1】:

    试试这些查询:

    制作人:

    SELECT
      p.name,
      SUM(i.quantity * i.unit_price) AS as_supplier_total,
      cagg.as_client_total
    FROM producer p
    LEFT JOIN transaction t on t.supplier_id = p.id AND t.supplier_type = 'App\\Producer'
    LEFT JOIN item i ON t.id = i.transaction_id
    LEFT JOIN (
      SELECT
        p.id,
        SUM(i.quantity * i.unit_price) AS as_client_total
      FROM producer p
      LEFT JOIN transaction t on t.client_id = p.id AND t.client_type = 'App\\Producer'
      LEFT JOIN item i ON t.id = i.transaction_id
      GROUP BY p.id
    ) AS cagg ON cagg.id = p.id
    GROUP BY p.id
    

    对于零售商:

    SELECT
      r.name,
      SUM(i.quantity * i.unit_price) AS as_supplier_total,
      cagg.as_client_total
    FROM retailer r
    LEFT JOIN transaction t on t.supplier_id = r.id AND t.supplier_type = 'App\\Retailer'
    LEFT JOIN item i ON t.id = i.transaction_id
    LEFT JOIN (
      SELECT
        r.id,
        SUM(i.quantity * i.unit_price) AS as_client_total
      FROM retailer r
      LEFT JOIN transaction t on t.client_id = r.id AND t.client_type = 'App\\Retailer'
      LEFT JOIN item i ON t.id = i.transaction_id
      GROUP BY r.id
    ) AS cagg ON cagg.id = r.id
    GROUP BY r.id
    

    【讨论】:

    • cagg 代表什么?
    • 只是一个随机别名(“客户端聚合”的缩写)
    猜你喜欢
    • 2014-02-13
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    相关资源
    最近更新 更多