2016-10-21 14 views
0

連接兩個表中的行我有兩個表e_sku和e_availability,在e_sku表I具有45行與默認的可用性爲1,下面是一個例子MySQL的一個表中

id is_available name 
1 1    UN001N 
2 1    UN002N 
3 1    UN003N 
4 1    UN004N 
5 1    UN005N 
6 1    UN006N 
7 1    UN007N 
8 1    UN008N 
9 1    UN009N 
10 1    UN010N 
11 1    UN011N 
12 1    UN012N 
13 1    UN013N 
14 1    UN014N 
15 1    UN015N 
16 1    UN016N 
17 1    UN017N 
18 1    UN018N 
19 1    UN019N 
20 1    UN020N 
21 1    UN021N 
22 1    UN022N 
23 1    UN023N 
24 1    UN024N 
25 1    UN025N 
26 1    UN026N 
27 1    UN027N 
28 1    UN028N 
29 1    UN029N 
30 1    UN030N 
31 1    UN031N 
32 1    UN032N 
33 1    UN033N 
34 1    UN034N 
35 1    UN035N 
36 1    UN036N 
37 1    UN037N 
38 1    UN038N 
39 1    UN039N 
40 1    UN040N 
41 1    UN041N 
42 1    UN042N 
43 1    UN043N 
44 1    UN044N 
45 1    UN045N 

第二個表是e_availability在此表我只存儲與以下日期不可用是因爲數據是捕捉每一個日期不可用,所以我只收集不可用的產品在e_availability表WRT數據的例子

id e_sku_id is_available working_date 
1 5   0    10/20/2016 
2 8   0    10/20/2016 
3 10   0    10/20/2016 
4 1   0    10/20/2016 
5 15   0    10/20/2016 
6 11   0    10/19/2016 
7 1   0    10/19/2016 

日期,現在我正在尋找顯示每天的數據爲完整的skus,以便每天的報告將顯示45 skus和可用sku它將顯示1從e_sku表的列is_available和不可用的sku它將顯示列來自e_availability表的is_availability

我正在使用mysql數據庫,我嘗試了許多連接查詢但沒有收到報告。 可以在任何一個導向哪些加入我需要

我用這個查詢

SELECT * FROM (SELECT id,NAME,1 AS is_available FROM e_sku 
WHERE company_id = 2 
AND id NOT IN (SELECT id FROM (SELECT e_sku.id,e_sku.name, edge_availability.is_available FROM edge_availability 
JOIN edge_working ON edge_working.`id` = edge_availability.`working_id` 
JOIN e_sku ON e_sku.id = edge_availability.`sku_id` 
WHERE edge_working.`working_date` = '2016-10-19' AND edge_availability.`store_id` = 84) X) 
UNION 
SELECT e_sku.id,e_sku.name, edge_availability.is_available FROM edge_availability 
JOIN edge_working ON edge_working.`id` = edge_availability.`working_id` 
JOIN e_sku ON e_sku.id = edge_availability.`sku_id` 
WHERE edge_working.`working_date` = '2016-10-19' AND edge_availability.`store_id` = 84) Y 
ORDER BY id 

回答

0

您可以使用LEFT JOINe_availability表中沒有找到一個日期,檢測得到的結果。對於該表中的所有列,聯接將返回NULL,則可以將其默認爲e_sku的值。

SELECT d.date, s.id, IFNULL(a.is_available, s.is_available) AS is_available 
FROM all_dates AS d 
CROSS JOIN e_sku AS s 
LEFT JOIN e_availability ON d.working_date = a.date AND s.id = a.e_sku_id 

你需要創建一個包含所有要報告的日期附加表all_dates。請參閱What is the most straightforward way to pad empty dates in sql results (on either mysql or perl end)?瞭解如何動態創建這樣的表格。