【问题标题】:How to get data from 2 tables in MYSQL如何从MYSQL中的2个表中获取数据
【发布时间】:2012-08-30 03:25:53
【问题描述】:

假设我有 2 个表:成员和订单 (Mysql)

Members : 
id   |   name
1    |   Lee
2    |   brad
Orders : 
id   |   member_id   |   status (1: paid, 2: unpaid)   |    total
1    |   1           |   1                             |   1000000 
2    |   1           |   1                             |   1500000
3    |   1           |   2                             |   1300000
4    |   2           |   1                             |   3000000 
5    |   2           |   2                             |   3500000
6    |   2           |   2                             |   3300000

我有一个 sql 查询:

SELECT m.name,
       o.member_id,
       COUNT(o.id)  AS number_of_order,
       SUM(o.total) AS total2
FROM   orders o
       LEFT JOIN members m
              ON o.member_id = m.id
GROUP  BY o.member_id

给我这个:

name   |   number_of_order   |   total2
Lee    |   3                 |   3800000
brad   |   3                 |   9800000

我想要的是这样的:

    name   |   number_of_order   |   total2
           |  Paid        Unpaid | Paid      Unpaid
    ------------------------------------------------
    Lee    |         3           |   3800000
           |  2             1    | 2500000   1300000
    ------------------------------------------------
    brad   |         3           |   9800000
           |  1             2    | 3000000   6800000
    ------------------------------------------------

如何进行可以给我结果的查询?

感谢您的宝贵时间!

【问题讨论】:

  • 在您的选择查询中,m.name 不是 group by 子句的一部分,那么它将如何工作?
  • 这是我的拼写错误。我更新了我的问题。谢谢你注意到我!

标签: mysql database join left-join


【解决方案1】:

您可以在SUM/COUNT 函数中使用条件。

SELECT 
  m.name,
  COUNT(o.id) AS number_of_order,
  SUM(o.total) AS total2,
  COUNT(IF(o.status=1, 1, NULL)) AS paid_order,
  COUNT(IF(o.status=2, 1, NULL)) AS unpaid_order,
  SUM(IF(o.status=1, o.total, 0)) AS paid,
  SUM(IF(o.status=2, o.total, 0)) AS unpaid
FROM orders o 
LEFT JOIN members m ON o.member_id=m.id
GROUP BY o.member_id

【讨论】:

    【解决方案2】:

    尝试使用不同的别名和 where 子句多次列出订单表。比如:

    SELECT m.name,
           COUNT(po.id),
           COUNT(uo.id),
           COUNT(o.id),
           SUM(po.total),
           SUM(uo.total),
           SUM(o.total)
    FROM   members m,
           orders o,
           orders po,
           orders uo
    WHERE  o.member_id = m.id
           AND po.member_id = m.id
           AND uo.member_id = m.id
           AND po.status = 1
           AND uo.status = 2
    GROUP  BY m.name
    

    这并不完全符合您的要求,但它应该能让您朝着正确的方向前进。

    【讨论】:

    • 注意表别名。每个都将独立于另一个工作。不过我更喜欢你的解决方案。
    • 我也编辑了所有订单,但我仍然更喜欢你的解决方案。
    • 我也应该使用外连接,但结果将是相同的,因为示例数据集中两个用户都有已付款和未付款的订单。否则,它会省略没有两者的成员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2020-10-23
    相关资源
    最近更新 更多