内部连接和子查询
Inner Joins and a Subquery
请多多包涵。在开始写这篇文章之前,我已经搜索过推荐的帖子,但似乎没有与我的情况相似的地方,所以就这样吧。
设置
- 订单Table(订单ID、产品ID、客户ID)
- 客户Table(custID、custName、电子邮件、联系人)
- Order_Status Table (orderID, orderDate, custID, status)
- 元数据Table(id、键、值)
示例数据
订单Table(在本例中,为产品 #234 下了 3 个订单)
12, 234, 1
13, 234, 2
14, 234, 3
客户Table
1, Sarah, sarah@gmail.com, 111-2345
2, Lyn, lyn@yahoo.com, 112-3434
3, John, john@gmail.com, 123-4444
订单状态Table
12, 2021-02-01, 1, paid
13, 2021-02-03, 2, awaiting payment
14, 2021-02-08, 3, pending
元数据Table
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
预期输出(一些值被缩短以保存space)
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 JOINs的方式获取到“payment”栏对应的数据,基本上我可以通过table的方式从元数据中获取必要的数据的一个子查询。我在“加入”第一个 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
如何合并两个 table?非常感谢您的帮助。 TIA!
您需要为每个需要的元数据引用元数据的 table,为此您可以使用 table 的名称别名
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 的建议,您不应该为 table 名称(“订单”)使用保留字。如果您确实需要,那么您应该使用 backtics(和别名)
请多多包涵。在开始写这篇文章之前,我已经搜索过推荐的帖子,但似乎没有与我的情况相似的地方,所以就这样吧。
设置
- 订单Table(订单ID、产品ID、客户ID)
- 客户Table(custID、custName、电子邮件、联系人)
- Order_Status Table (orderID, orderDate, custID, status)
- 元数据Table(id、键、值)
示例数据
订单Table(在本例中,为产品 #234 下了 3 个订单)
12, 234, 1
13, 234, 2
14, 234, 3
客户Table
1, Sarah, sarah@gmail.com, 111-2345
2, Lyn, lyn@yahoo.com, 112-3434
3, John, john@gmail.com, 123-4444
订单状态Table
12, 2021-02-01, 1, paid
13, 2021-02-03, 2, awaiting payment
14, 2021-02-08, 3, pending
元数据Table
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
预期输出(一些值被缩短以保存space)
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 JOINs的方式获取到“payment”栏对应的数据,基本上我可以通过table的方式从元数据中获取必要的数据的一个子查询。我在“加入”第一个 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
如何合并两个 table?非常感谢您的帮助。 TIA!
您需要为每个需要的元数据引用元数据的 table,为此您可以使用 table 的名称别名
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 的建议,您不应该为 table 名称(“订单”)使用保留字。如果您确实需要,那么您应该使用 backtics(和别名)