【问题标题】:MySQL Query to join three table and get data from 2nd and 3rd tableMySQL Query 连接三个表并从第二个和第三个表中获取数据
【发布时间】:2019-01-13 18:08:50
【问题描述】:

我有 3 张桌子:

表 1:表名:FULL_DATA

DATE        ORDER_NO               AMOUNT   MODE
01-04-2019  ADVANVCE.:ORD1971718    5000    DEBIT-CARD
01-04-2019  ADVANVCE.:ORD1961718    6000    CASH
01-04-2019  ADVANVCE.:ORD2001819    8000    CASH
02-04-2019  ADVANVCE.:ORD2011819    10000   CASH
02-04-2019  ADVANVCE.:ORD0891819    3000    CASH
02-04-2019  ADVANVCE.:ORD2021819    8000    DEBIT-CARD
02-04-2019  ADVANVCE.:ORD2031819    12000   CASH
03-04-2019  ADVANVCE.:ORD2041819    14000   CASH
03-04-2019  ADVANVCE.:ORD2051819 17000  CASH
03-04-2019  ADVANVCE.:ORD2061819    14000   CASH
03-04-2019  ADVANVCE.:ORD2061819    15000   DEBIT-CARD
03-04-2019  ADVANVCE.:ORD2071819    4000    DEBIT-CARD
03-04-2019  ADVANVCE.:ORD2071819    1000    CASH
04-04-2019  ADVANVCE.:ORD2101819    500 CASH
04-04-2019  ADVANVCE.:ORD2091819    1000    CASH
04-04-2019  ADVANVCE.:ORD2081819    2000    CASH
04-04-2019  ADVANVCE.:ORD0471819    8000    CASH

表 2:表名:ORDER_DETAILS

ORDER_NO    ITEM_NAME   CUSTOMER_ID
ORD2001819  ITEM-1      7
ORD2011819  ITEM-2      6
ORD2021819  ITEM-3      5
ORD2021819  ITEM-4      5
ORD2021819  ITEM-5      5
ORD2021819  ITEM-6      5
ORD2031819  ITEM-7      8
ORD2041819  ITEM-8      67
ORD2041819  ITEM-9      67
ORD2051819  ITEM-10     89
ORD2061819  ITEM-11     54
ORD2061819  ITEM-12     54
ORD2071819  ITEM-13     11
ORD2101819  ITEM-14     12
ORD2091819  ITEM-15     14
ORD2081819  ITEM-16     16
ORD1971718  ITEM-17     68
ORD1971718  ITEM-18     68
ORD0471819  ITEM-19     90
ORD0891819  ITEM-20     44
ORD1961718  ITEM-21     55

表 3:表名:CUSTOMER_DETAILS

CUSTOMER_ID    CUSTOMER_NAME
7              CUSTOMER-1
6              CUSTOMER-24
5              CUSTOMER-39
8              CUSTOMER-40
67             CUSTOMER-15
89             CUSTOMER-66
54             CUSTOMER-7
11             CUSTOMER-89
12             CUSTOMER-9
14             CUSTOMER-10
16             CUSTOMER-11
68             CUSTOMER-121
90             CUSTOMER-134
44             CUSTOMER-147
55             CUSTOMER-158

查询JOIN这些表,这些表将包含来自 FULL_DATA 表和 JOIN 它的 ORDER_NO 的日期、订单号、数量、模式列(通过拆分订单号“:”获取订单号)和订单详情表并获取它客户ID 和 JOIN 其客户 ID 和客户详细信息表并获取客户名称????

数据将如下所示:

最终查询结果:

DATE        CUSTOMER_NAME   ORDER_NO               AMOUNT   MODE
01-04-2019  CUSTOMER-121    ADVANVCE.:ORD1971718    5000    DEBIT-CARD
01-04-2019  CUSTOMER-158    ADVANVCE.:ORD1961718    6000    CASH
01-04-2019  CUSTOMER-1      ADVANVCE.:ORD2001819    8000    CASH
02-04-2019  CUSTOMER-24     ADVANVCE.:ORD2011819    10000   CASH
02-04-2019  CUSTOMER-147    ADVANVCE.:ORD0891819    3000    CASH
02-04-2019  CUSTOMER-39     ADVANVCE.:ORD2021819    8000    DEBIT-CARD
02-04-2019  CUSTOMER-40     ADVANVCE.:ORD2031819    12000   CASH
03-04-2019  CUSTOMER-15     ADVANVCE.:ORD2041819    14000   CASH
03-04-2019  CUSTOMER-66     ADVANVCE.:ORD2051819    17000   CASH
03-04-2019  CUSTOMER-7      ADVANVCE.:ORD2061819    14000   CASH
03-04-2019  CUSTOMER-7      ADVANVCE.:ORD2061819    15000   DEBIT-CARD
03-04-2019  CUSTOMER-89     ADVANVCE.:ORD2071819    4000    DEBIT-CARD
03-04-2019  CUSTOMER-89     ADVANVCE.:ORD2071819    1000    CASH
04-04-2019  CUSTOMER-9      ADVANVCE.:ORD2101819    500     CASH
04-04-2019  CUSTOMER-10     ADVANVCE.:ORD2091819    1000    CASH
04-04-2019  CUSTOMER-11     ADVANVCE.:ORD2081819    2000    CASH
04-04-2019  CUSTOMER-134    ADVANVCE.:ORD0471819    8000    CASH

【问题讨论】:

  • 不要全部使用大写字母,它很难阅读。并澄清你的问题,四个问号并不能使问题更明显。
  • 对不起,我在这个问题上停留了 4 天..
  • 对我来说,这看起来像是一个简单的连接,所以你真的需要澄清这个问题以及你 4 天以来一直坚持的问题。
  • 下次我会记住的..
  • 如果我只是离开加入我的表 full_data 和 order_details,它会根据 order_details 表(如 ORD2021819)多次显示相同的记录,如果我只是离开加入,它将向我显示此订单 4 次

标签: mysql sql mysql-workbench


【解决方案1】:

如果数据中的这些订单号始终是:之后的最后一部分?

SELECT
 d.DATE, 
 GROUP_CONCAT(DISTINCT c.CUSTOMER_NAME) AS CUSTOMER_NAMES,
 d.ORDER_NO,
 d.AMOUNT,
 d.MODE
FROM FULL_DATA d
LEFT JOIN ORDER_DETAILS o 
  ON o.ORDER_NO = RTRIM(SUBSTRING_INDEX(d.ORDER_NO,':',-1))
LEFT JOIN CUSTOMER_DETAILS c ON c.CUSTOMER_ID = o.CUSTOMER_ID
GROUP BY 
 d.DATE, 
 d.ORDER_NO,
 d.AMOUNT,
 d.MODE

每个订单有多个商品。
理论上,每个订单可能有超过 1 个客户。
所以这里使用的是 GROUP_CONCAT 而不是 MAX。

【讨论】:

  • 在我看来,它应该类似于SUBSTR(FULL_DATA.ORDER_NO, LOCATE(':', FULL_DATA.ORDER_NO) + 1),但比@LukStorms 的建议要慢。
  • 我已经找到了从文本中获取订单号的方法我的问题是我无法以正确的方式加入这些表格
  • 您需要对 AMOUNT 字段值求和吗?您的第一行中有 5000 个订单 ORD1971718。这似乎是一个奇怪的结果
  • 不,我只需要 full_data 表中的客户名称
  • 选择 FULL_DATA.DATE, CUSTOMER_DETAILS.CUSTOMER_NAME, FULL_DATA.ORDER_NO, FULL_DATA.AMOUNT, FULL_DATA.MODE FROM MYDB.FULL_DATA LEFT JOIN MYDB.ORDER_DETAILS ON SUBSTRING_INDEX(FULL_DATA.ORDER_NO,':',-1 )=ORDER_DETAILS.ORDER_NO LEFT JOIN CUSTOMER_DETAILS ON ORDER_DETAILS.CUSTOMER_ID=CUSTOMER_DETAILS.CUSTOMER_ID WHERE FULL_DATA.DATE BETWEEN '2019-04-01' 和 '2019-04-04' ORDER BY FULL_DATA.DATE ASC
【解决方案2】:

我通过从 order_detaisl 中为 customer_id 和 order_no 选择不同的值来进行连接

SELECT f.DATE, CUSTOMER_NAME, f.ORDER_NO, AMOUNT, MODE 
FROM FULL_DATA f
JOIN (SELECT DISTINCT customer_id, order_no 
      FROM ORDER_DETAILS) o ON SUBSTRING_INDEX(f.ORDER_NO,':',-1)= o.ORDER_NO 
JOIN CUSTOMER_DETAILS c ON o.CUSTOMER_ID = c.CUSTOMER_ID 
WHERE f.DATE BETWEEN '2019-04-01' AND '2019-04-04' 
ORDER BY f.DATE ASC

【讨论】:

  • 我认为这段代码非常适合我的软件......非常感谢......
【解决方案3】:

它将从 full_data 表中获取每个订单号,并使用第 2 和第 3 表查找订单无客户详细信息,并在日期列之后显示客户名称

【讨论】:

    猜你喜欢
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2012-10-11
    • 1970-01-01
    • 2019-07-19
    相关资源
    最近更新 更多