MySQL -从每个表中获取每个客户的最大行,并提供符合条件的结果

blmhpbnm  于 2023-02-18  发布在  Mysql
关注(0)|答案(1)|浏览(95)

我正在开发一个系统,在这个系统中,我们将客户数据拆分到多个表中。例如(简化):
客户状态
| 身份证|姓名|地位|
| - ------|- ------|- ------|
| 1个|斯坦|主动|
| 第二章|丹尼|封闭的|
| 三个|埃勒|主动|
| 四个|斯坦|主动|
账户状态
| 身份证|姓名|地位|
| - ------|- ------|- ------|
| 1个|斯坦|信誉良好|
| 第二章|丹尼|信誉良好|
| 三个|埃勒|信誉良好|
| 四个|斯坦|拖欠|
| 五个|斯坦|信誉良好|
| 六个|埃勒|拖欠|
订单状态
| 身份证|姓名|地位|
| - ------|- ------|- ------|
| 1个|斯坦|订购|
| 第二章|丹尼|订购|
| 三个|埃勒|待定|
| 四个|斯坦|已完成|
| 五个|斯坦|待定|
| 六个|埃勒|订购|
如果我想识别所有客户,那么:

  • 客户状态:活跃
  • 账户状态:拖欠
  • 订单状态:待定

在上面的示例中,唯一返回的名称应该是Stan
我一直在尝试这样的SQL,但意识到它选择的不是最大值,而是具有我的过滤器的最大值:

SELECT * FROM customer_status c
WHERE c.id = (SELECT MAX(c2.id) FROM customer_status c2 WHERE c2.name  = c.name) AND c.status = "active"
AND c.name in (SELECT name FROM account_status as WHERE as.id = (SELECT MAX(as2.id) FROM account_status as2 WHERE as.name = as2.name) AND as.active = "in arrears")
AND c.name in (SELECT name FROM order_status os WHERE os.id = (SELECT MAX(os.id) FROM order_status os2 WHERE os.name = os2.name) AND os.status = "Pending")

我意识到,返回的帐户状态和订单状态行是具有所提供状态的最高ID,而我希望获取每个客户的最后一行,然后仅在他们具有正确状态时才将其传递回来。
这里是否需要改用联接?

dgtucam1

dgtucam11#

您可以像这样进行简单的联接:

SELECT * FROM customer_status c
INNER JOIN account_status as ON c.name  = as.name
INNER JOIN order_status os ON c.name = os.name
 WHERE c.status = "active"
   AND as.active = "in arrears"
   AND os.status = "Pending"

相关问题