【问题标题】:mysql fetch a column value from another table in existing querymysql 从现有查询中的另一个表中获取列值
【发布时间】:2016-02-17 08:30:43
【问题描述】:

我有三个 MySQL 表,成功地完成了一个查询,该查询对支付表进行了一些计算,以根据订单显示。

问题: 需要从下面提到的查询连接条件中的 sku_mapping 表中获取 full_name 列是

concat ('f|',fk_orders.sku) = sku_mapping.prefix_sku

fk_orders

|order_item_id |order_id    |Invoice_No       |Invoice_No_Amt  |Qty   |Refund_Qty |Refund_Amount | sku
------------------------------------------------------------------------------------------------------
|1131231       |123         |F08OTTN16-1      |100            |1     |            |              |A3001
|1113138       |321         |F08OTTN16-2      |200            |2     |1           |200           |B1001
|1231231       |023         |F08OTTN16-3      |100            |1     |1           |100           |C2001
|1133138       |320         |F08OTTN16-4      |200            |2     |            |              |D8901
|1134231       |103         |F08OTTN16-5      |100            |1     |            |              |E6210
|1113538       |300         |F08OTTN16-6      |200            |2     |            |              |F1001
|1003538       |300         |F08OTTN16-7      |200            |2     |            |              |G9003

fk_payments

|order_item_id    |order_id    |Invoice_No       |Invoice_No_Amt |Settlement_Value
-----------------------------------------------------------------------------------
|OI:1131231       |123         |F08OTTN16-1      |100            |40
|OI:1113138       |321         |F08OTTN16-2      |200            |150
|OI:1231231       |023         |F08OTTN16-3      |100            |-50
|OI:1133138       |320         |F08OTTN16-4      |200            |200
|OI:1134231       |103         |F08OTTN16-5      |100            |40
|OI:1113538       |300         |F08OTTN16-6      |200            |250
|OI:1131231       |123         |F08OTTN16-1      |100            |40
|OI:1133138       |320         |F08OTTN16-4      |200            |100
|OI:1113138       |321         |F08OTTN16-2      |200            |-200

sku_mapping

|prefix_sku |full_name 
-------------------
x|A3001     |Apple_Phone
f|B1001     |Belkin
f|C2001     |Cat_Access
f|D8901     |Dlink
f|E6210     |Eltron
f|F1001     |Flag
f|G9003     |gott
f|A3001     |Phone
a|B1001     |Belkin
a|C2001     |Cat_Access
a|D8901     |Dlink
a|E6210     |Eltron
a|F1001     |Flag
a|G9003     |gott

当前结果

|order_item_id  |order_id   |Invoice_No     |Invoice_No_Amt |Qty    |Refund_Qty |Refund_Amount  |sku    |SettledAmount  |netAmount
------------------------------------------------------------------------------------------------------------------------------------
|1131231        |123        |F08OTTN16-1    |100            |1      |           |               |A3001  |80             |20
|1113138        |321        |F08OTTN16-2    |200            |2      |1          |200            |B1001  |150            |50
|1231231        |23         |F08OTTN16-3    |100            |1      |1          |100            |C2001  |50             |50 
|1133138        |320        |F08OTTN16-4    |200            |2      |           |               |D8901  |300            |-100
|1134231        |103        |F08OTTN16-5    |100            |1      |           |               |E6210  |40             |60
|1113538        |300        |F08OTTN16-6    |200            |2      |           |               |F1001  |250            |-50
|1003538        |300        |F08OTTN16-7    |200            |2      |           |               |G9003  |0              |200

预期结果(需要 sku_prefix 表中的全名列)

|order_item_id  |order_id   |Invoice_No     |Invoice_No_Amt |Qty    |Refund_Qty |Refund_Amount  |sku    |SettledAmount  |netAmount  |full_name
-----------------------------------------------------------------------------------------------------------------------------------------------
|1131231        |123        |F08OTTN16-1    |100            |1      |           |               |A3001  |80             |20         |Apple_Phone
|1113138        |321        |F08OTTN16-2    |200            |2      |1          |200            |B1001  |150            |50         |Belkin
|1231231        |23         |F08OTTN16-3    |100            |1      |1          |100            |C2001  |50             |50         |Cat_Access
|1133138        |320        |F08OTTN16-4    |200            |2      |           |               |D8901  |300            |-100       |Dlink
|1134231        |103        |F08OTTN16-5    |100            |1      |           |               |E6210  |40             |60         |Eltron
|1113538        |300        |F08OTTN16-6    |200            |2      |           |               |F1001  |250            |-50        |Flag
|1003538        |300        |F08OTTN16-7    |200            |2      |           |               |G9003  |0              |200        |gott

当前代码

select o.*,
       (coalesce(Refund_Amount, 0) + coalesce(sv, 0)) as SettledAmount,
       (Invoice_No_Amt - coalesce(Refund_Amount, 0) - coalesce(sv, 0)) as netAmount
from fk_orders o left join
     (select invoice_no, sum(Settlement_Value) as sv
      from fk_payments
      group by invoice_no
     ) p
     on o.invoice_no = p.invoice_no;

【问题讨论】:

  • 发布您当前的代码,以便人们可以使用它
  • @Matt 添加了代码。谢谢我错过了
  • 您目前如何撤回 sku?代码中没有提到它,或者它在 fk_orders 表中?
  • @Matt 这就是我要做的。我想我需要添加下面的代码,但不知道如何放置它FROM fk_orders,sku_mapping WHERE concat ('f|',fk_orders.sku)=sku_mapping.prefix_sku
  • 好的,你应该提到上面的 fk_orders 表示例数据中有一个 fk_orders.sku

标签: mysql subquery


【解决方案1】:

假设 fk_orders 有一个 sku 字段。

SELECT o.*, sk.full_name, (coalesce(Refund_Amount, 0) + coalesce(sv, 0)) AS SettledAmount, (Invoice_No_Amt - coalesce(Refund_Amount, 0) - coalesce(sv, 0)) AS netAmount
FROM fk_orders o 
LEFT JOIN (SELECT invoice_no, SUM(Settlement_Value) AS sv
           FROM fk_payments
           GROUP BY invoice_no) p ON o.invoice_no = p.invoice_no
INNER JOIN sku_mapping sk ON o.sku = SUBSTRING_INDEX(prefix_sku,'|',-1)

【讨论】:

  • 效果很好。已编辑订单表。我之前错过了添加 sku 列
  • 上述代码在使用测试表时存在问题。实际前缀是“f|”我确实替换了它 SUBSTRING_INDEX(prefix_sku,'f|',-1) 但输出结果发票序列被挂起。另外我在每个表中有大约 40000 行。而且每个表都有许多其他列,这些列没有在上面列出,因为只是想看起来整洁。如果没有 innerjoin,代码也适用于 40 K 行。但是如果我添加内部连接代码没有结果。我在 sku_table 中做了一个小改动,所以你在你的地方复制它
  • | 之前的内容无关紧要,它可能是 abc|E3001 并且相同的代码会挑选出 E3001
  • 只有前缀为f|才需要加入(f 带管道)如果发生更改,现在我对示例 sku_mapping 表进行了更改,结果未按发票编号排序。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 2023-03-23
相关资源
最近更新 更多