【问题标题】:query to get customer list using JOIN with sum () of the amounts spent in orders查询以使用 JOIN 和 sum() 获取订单中花费的金额的客户列表
【发布时间】:2021-09-30 00:22:48
【问题描述】:

我有以下表格

anag(客户注册表)


  id  |  surname   |  name  |     phone      | 
----------------------------------------------
  1   |  Brown     |  Jack  |  +3989265781   |
  2   |  Smith     |  Bill  |  +3954872358   |
  3   |  Rogers    |  Stan  |  +3912568453   |
  4   |  Pickford  |  Eric  |  +3948521358   |
----------------------------------------------

levels(将每个客户与其销售人员联系起来的表。出于数据库注册的原因,客户和卖方之间的联系由客户的电话号码给出)


  id  |  client_phone  |  id_seller  |
--------------------------------------
  1   |  +3989265781   |     4       | 
  2   |  +3954872358   |     7       |
  3   |  +3912568453   |     7       |
  4   |  +3948521358   |     8       |
--------------------------------------

table orders(当然包含客户购买的所有商品)


  id  |  id_client  |  id_item  |  id_seller  |  price  |  status  |
--------------------------------------------------------------------
  1   |      1      |     2     |      4      |  12.50  |    2     |
  2   |      2      |     2     |      7      |  12.50  |    2     |
  3   |      2      |     3     |      7      |  10.00  |    3     |
  4   |      2      |     3     |      7      |  10.00  |    3     |
  5   |      2      |     4     |      7      |  20.50  |    1     |
  6   |      3      |     2     |      7      |  12.50  |    1     |
  7   |      3      |     5     |      7      |  19.00  |    3     |
  8   |      3      |     7     |      7      |  31.00  |    2     |
  9   |      4      |     1     |      8      |   5.00  |    1     |
--------------------------------------------------------------------

我想要做的是从这些表的 JOIN 中得到一个完整的列表,由他的客户的卖家按订单花费的金额降序排序,只要订单状态是 2 或 3
像这样的东西(例如卖家 id 7):


  id  |  surname  |  name  |  amaount  | 
----------------------------------------
  3   |  Rogers   |  Stan  |  50.00    |
  2   |  Smith    |  Bill  |  32.50    |
----------------------------------------

我已经尝试过这个对我来说似乎正确的查询,但不幸的是它在 fetch_assoc() 中返回错误

SELECT a.id, a.surname, a.name, o.amount FROM levels AS l
JOIN anag AS a ON a.phone = l.client_phone
JOIN {
    SELECT id_client, SUM(price) AS amount FROM orders
    WHERE id_seller = '7' AND (status = '2' OR status = '3') GROUP BY id_client
} AS o ON o.id_client = a.id
WHERE l.id_seller = '7'
ORDER BY o.amount DESC

如果我将子查询与主查询分开,两者都返回我期望的数据,我觉得这两者之间的 JOIN 无法正常工作似乎很奇怪

【问题讨论】:

标签: mysql sql join sum


【解决方案1】:

我认为唯一真正的错误是使用花括号而不是括号:

SELECT a.id, a.surname, a.name, o.amount
FROM levels l JOIN
     anag a
     ON a.phone = l.client_phone JOIN
     (SELECT id_client, SUM(price) AS amount
      FROM orders
      WHERE id_seller = '7' AND status IN ('2', '3'))
      GROUP BY id_client
     ) o
     ON o.id_client = a.id
WHERE l.id_seller = '7'
ORDER BY o.amount DESC;

另外:

  • 您可以使用IN 将相等比较缩短为多个值。
  • 虽然我把它们留在里面,statusid_seller 看起来像数字。如果是这样,请删除单引号。不要混合数据类型。
  • 如果orders 中的卖家与anag 中的卖家不同,您的问题是不明确的。这样可以保持您的逻辑(卖家需要匹配)。

【讨论】:

  • 我犯了这样一个小错误吗?所以它看起来。谢谢,我只是无法得到它。我会用 IN 试试你的建议。 status 和 id_seller 参数是从一些变量中获得的,我想避免将来如果数据更改为字符串时不得不返工。一旦注册,用户就永远与那个卖家联系在一起,所以从逻辑上讲,他永远无法问自己这个问题
【解决方案2】:

SELECT a.id, a.surname, a.name, sum(o.price) 'amount'

来自阿纳格

LEFT JOIN 级别 l ON l.id =a.id

o.id_seller = l.id_seller AND o.id_client = l.id 的左连接订单

按 o.id_seller 分组

按数量 DESC 排序

【讨论】:

    猜你喜欢
    • 2020-12-11
    • 2021-11-23
    • 1970-01-01
    • 2019-12-17
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多