【问题标题】:Inner Joins and a Subquery内连接和子查询
【发布时间】:2021-05-13 20:54:41
【问题描述】:

请多多包涵。在开始写这篇文章之前,我已经搜索过推荐的帖子,但似乎没有什么与我的情况相似,所以就这样吧。

设置

  1. 订单表(orderID、productID、custID)
  2. 客户表(客户 ID、客户名称、电子邮件、联系人)
  3. Order_Status 表(orderID、orderDate、custID、状态)
  4. 元数据表(id、key、value)

样本数据

订单表(在本例中,为产品 #234 下了 3 个订单)

12, 234, 1
13, 234, 2
14, 234, 3

客户表

1, Sarah, sarah@gmail.com, 111-2345
2, Lyn, lyn@yahoo.com, 112-3434
3, John, john@gmail.com, 123-4444

订单状态表

12, 2021-02-01, 1, paid
13, 2021-02-03, 2, awaiting payment
14, 2021-02-08, 3, pending

元数据表

12, payment_method, cash
12, city, SF
12, state, LUN
13, payment_method, deposit
13, city, QC
13, state, NCR
14, payment_method, cc
14, city, QC
14, state, NCR
15, screen, 1024x768

预期输出(缩短一些值以节省空间)

custID | Name  |      email      | orderID | orderDate  | payment | status | city | state
============================================================================================
1      | Sarah | sarah@gmail.com |    12   | 2021-02-01 | cash    | paid   | SF   | LUN
2      | Lyn   | lyn@yahoo.com   |    13   | 2021-02-03 | bank    | waiting| QC   | NCR
3      | John  | john@gmail.com  |    14   | 2021-02-08 | credit  | pending| QC   | NCR

到目前为止,我能够通过 INNER JOIN 获取与“付款”列对应的数据,并且基本上我能够通过子查询从 Metadata 表中获取必要的数据。我在“加入”第一个 JOIN 和子查询结果集时遇到了困难。

这是我的 JOIN 代码:

SELECT  customer.custID,
        customer.custName,
        customer.email,
        order.orderID,
        order_status.orderDate,
        metadata.value AS 'payment_method',
        order_status.status        
FROM    ((( customer
INNER JOIN order 
      ON customer.customer_id = order.customer_id )
INNER JOIN order_status 
      ON order_status.order_id = order.order_id)
INNER JOIN metadata
      ON metadata.id = order.order_id 
      AND metadata.key = 'payment_method')

结果集:

custID | custName | email           | orderID | orderDate  | payment_method | status
1      | Sarah    | sarah@gmail.com | 12      | 2021-02-01 | cash           | paid
2      | Lyn      | lyn@yahoo.com   | 13      | 2021-02-03 | deposit        | awaiting payment
3      | John     | john@gmail.com  | 14      | 2021-02-08 | credit card    | pending

这是我的子查询代码:

SELECT id, key, value FROM metadata 
       WHERE id = 12
       AND key = ANY (
           SELECT key 
           FROM metadata 
           WHERE key = 'payment_method' 
             OR meta_key = 'city'
             OR meta_key = 'state' 
       ) 

在本例中,ID 是硬编码的,因此我可以测试代码。结果集是:

  id | key            | value
===================================
  12 | city           | SF
  12 | state          | LUN
  12 | payment_method | cash

如何合并这两个表?非常感谢您的帮助。蒂亚!

【问题讨论】:

  • 要么加入 3 个元数据表副本,要么使用条件聚合。
  • 不清楚你想做什么或你的问题是什么。 “合并”没有特别的含义。您是说第一个查询元数据表是第二个查询结果吗?错误的代码不会传达您希望它做的事情。 PS A minimal reproducible example 包括我们可以剪切、粘贴和运行的 DDL 和 DML。
  • Order是MySQL中的保留字,所以...
  • @philipxy,我的意思是“合并”,是指使用 INNER JOIN(第一个表)和子查询(第二个表)加入我第一次尝试的结果。
  • @草莓。哦耶。我忘记了。自从我从事数据库工作以来已经有一段时间了。 :D

标签: mysql join subquery


【解决方案1】:

您需要为所需的每个元数据引用元数据表,为此您可以使用表的名称别名

SELECT  customer.custID,
        customer.custName,
        customer.email,
        o.orderID,
        order_status.orderDate,
        m1.value AS 'payment_method',
        m2.value AS 'city',  
        m3.value AS 'state'     
        order_status.status        
FROM    customer
INNER JOIN `order` o  ON customer.customer_id = o.customer_id 
INNER JOIN order_status ON order_status.order_id = o.order_id
INNER JOIN metadata m1 ON m1.id = o.order_id 
      AND m1.key = 'payment_method'
INNER JOIN metadata m2 ON m2.id = o.order_id 
      AND m2.key = 'city'
INNER JOIN metadata m3 ON m3.id = o.order_id 
      AND m3.key = 'state'

正如@strawberry 所建议的,你不应该使用保留字作为表名(“订单”)。如果你真的需要,那么你应该回溯(和别名)

【讨论】:

  • 感谢@scaisEdge!这正是我所需要的。
猜你喜欢
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 2023-03-29
  • 2014-02-07
相关资源
最近更新 更多