简体   繁体   中英

MySQL Query to join three table and get data from 2nd and 3rd table

I HAVE 3 TABLES :

Table1: Table Name: 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

Table2: Table Name: 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

Table3: Table Name: 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

QUERY TO JOIN THESE TABLE WHICH WILL TAKE DATE, ORDER_NO, AMOUNT, MODE COLUMNS FROM FULL_DATA TABLE AND JOIN ITS ORDER_NO (GET ORDER NO BY SPLITTING ORDER NO BY ":") WITH ORDER_DETAILS TABLE AND GET IT CUSTOMER ID AND THEN JOIN ITS CUSTOMER ID WITH CUSTOMER DETAILS TABLE AND GET CUSTOMER NAMES????

THE DATA WILL BE LOOK LIKE THESE:

Final Query Result:

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

If those order numbers in the data are always the last part after the : ?

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

There are multiple items per order.
In theory there could be more than 1 customer per order.
So a GROUP_CONCAT is used here instead of a MAX.

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

I made a join by selecting distinct values for customer_id and order_no from order_detaisl

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM