2012-02-09 60 views
1

好吧,我從來沒有發佈在這裏,直到我花了幾天的時間試圖自己找出它 。SQL MYSQL多表查詢加入

這一個是非常艱難的。我會非常驚訝,也會對任何解決這個問題的人表示敬畏。

另請注意:我這樣做是在PHP中,並不在乎有多少查詢或循環 我需要做到這一點..所以如果多個查詢或PHP循環可以幫助,然後通過一切手段請提出建議。謝謝

更新:爲了簡化這個問題,如果你可以使用像%White Gold%insetad這樣的availMetals來解決它,像%catFilter.value%我認爲它會更容易。

我可以使用PHP循環完成剩下的工作。

謝謝任何​​花時間看的人。

我有3代表具有以下字段:

catFilter - (id, catTypeId, value) 
products - (id, availMetals) 
prodFilter - (id, catFilterId, productId) 

而下面的關係

products.id = prodFilter.productId 
catFilter.id = prodFilter.catFilterId 

我需要三條數據作爲 最終結果:

catFilter.id (also could be prodFilter.catFilterId) 
catFilter.value 

到目前爲止,我可以得到那兩個......我需要第三個......

A COUNT OF .. All Products who have an availMetals like 
of %White Gold% and also has catTypeId = 1 

這裏是最後的名單看起來像......

catFilter.value - 產品計數

classic - 0 
rings - 0 
sets - 1 
stones - 5 
three - 0 
halo - 3 

等。等...

下面是一些表格樣本數據

products 

id - availMetals 
111 - White Gold 
112 - White Gold, Yellow Gold 
113 - White Gold 
114 - White Gold 
115 - White Gold 
116 - White Gold, Platinum, Palladium 


prodFilter 

productId - catFilterId 
111 - 43 
111 - 12 
111 - 48 
111 - 47 
112 - 12 
112 - 51 
112 - 48 
113 - 12 
113 - 51 
113 - 48 
114 - 12 
114 - 51 
114 - 48 
115 - 12 
115 - 48 
116 - 12 
116 - 51 

catFilter 
id - catTypeId - value 
1 - 1 - Classic 
50 - 1 - Rings 
47 - 1 - Sets 
48 - 1 - Stones 
49 - 1 - Three 
51 - 1 - Halo 
+0

什麼是你的親表之間的聯繫與其他人的管道?該表中的id字段是否與另一個表中的id相對應? – 2012-02-09 09:00:17

+0

是的,product.id = prodFilter.productId和catFilter.id = prodFilter.catFilterId – 2012-02-09 09:07:58

+0

@BrianPatterson試試我的答案。 – 2012-02-09 09:24:40

回答

1

嘗試一下像:

SELECT cf.id, cf.value, COUNT(p.id) 
FROM catFilter cf 
INNER JOIN prodFilter pf ON pf.catFilterId = cf.id 
INNER JOIN products p ON p.id = productId 
WHERE cf.catTypeId = 1 AND p.availMetals LIKE CONCAT('%', cf.value, '%') 
GROUP BY cf.id 
+0

對不起,剛剛得到0的一排結果 – 2012-02-09 09:15:54

+0

對不起,只是粘貼了錯誤的,我已經更新了 – 2012-02-09 09:22:06

+0

空結果...在那裏我可以做到這一點與多個查詢..或使用PHP腳本循環? – 2012-02-09 09:28:30

1

我已經使用LEFT JOIN代替INNER JOIN,使其在計數返回零,如果它不products表中。試試這個:

選擇 a.ID, a。 Value, 計數(C *)爲ProductCount FROM catFilter左連接prodFilter B關於 a.catTypeID = b.catFilterID LEFT JOIN產品C對 b.productID = c.ID WHERE c.availMetals像CONCAT( '%',a。Value,'%')AND a.catTypeId = 1 GROUP BY a。ID

更新1

SELECT 
    c.`Value`, 
    COUNT(*) as TotalCount 
FROM Products a LEFT JOIN prodFIlter b on 
     a.ID = b.ProductID 
    LEFT JOIN catFilter c 
     b.CatFilterID = c.ID 
WHERE c.CatTypeID = 1 and 
     a.availmetals like CONCAT('%', 'White GOld','%') 
GROUP BY c.`Value` 
+0

hmmm ..空結果集 – 2012-02-09 09:26:27

+0

您是否將'PLACEVALUEHERE''改爲'a.Value'? – 2012-02-09 09:29:33

+0

我大概可以用這個在php中創建某種循環,但作爲一個獨立的查詢,它仍然給我空的結果 – 2012-02-09 09:33:49

1

這是否使的伎倆?

select cf.id, cf.value, 
    sum(if(cf.catTypeId = 1 and p.availMetals like concat('%', cf.value, '%') 
    = 1, 1, 0)) as FinalCount 
from catFilter cf 
join prodFilter pf on cf.id = pf.catFilterId 
join products p on pf.productId = p.id 
group by cf.id, cf.value 

編輯:

根據所提供的數據,沒有什麼應該匹配吧?因爲p.availMetals like concat('%', cf.value, '%')總是錯誤的。我們強迫它。更改此記錄:

prodFilter 
productId | catFilterId 
111  | 43 

這一個:

catFilter 
id | catTypeId | value 
1 | 1   | Classic 

並改變這一個:

catFilter 
id | catTypeId | value 
1 | 1   | Gold 

這樣的話,你就會有一個匹配,並且將通過查詢顯示。到目前爲止,這是一個數據問題。

編輯2

從給定的數據不能有3暈相符:

products 
id - availMetals 
111 - White Gold 
112 - White Gold, Yellow Gold <-- Will look here and won't match! 
113 - White Gold <-- Will look here and won't match! 
114 - White Gold <-- Will look here and won't match! 
115 - White Gold 
116 - White Gold, Platinum, Palladium <-- Will look here and won't match! 

且不說選擇的回答將不提供classic - 0或任何組0的結果。

+0

這是我見過的最接近的東西,除了「計數」都是0以外,一切都很好0 – 2012-02-09 09:29:49

+0

你確定嗎?我在這裏得到結果。你可以手工檢查一些行,看看爲什麼?也許你錯過了數據,或者你沒有真正的catTypeId = 1和availMetals像%cf.value%。如果你有一行符合該條件,你能否提供不匹配的數據,以便我可以將它添加到我的測試數據中?謝謝 – 2012-02-09 09:37:33

+0

再次使用 – 2012-02-09 09:47:35

1

權,讓我們試着一步一步:

SELECT * FROM catFilter 
LEFT JOIN prodFilter ON catFilter.id = prodFilter.catFilterId 
LEFT JOIN products ON products.id = prodFilter.productId 

以上,根據你描述的關係,將返回該表中存在連接成一個關係中的所有數據。因爲我們使用了LEFT JOIN,所以我們也會得到沒有在任何產品中使用的catFilters。

現在,添加你提到的情況,讓我們添加WHERE條件:

WHERE availMetals LIKE '%White Gold%' AND catTypeId = 1 

現在,你想要的結果由CatFilter數值進行彙總,讓我們添加一個分組條件:

GROUP BY catFilter.value 

而現在,我們只需選擇計數/場需要:

SELECT catFilter.id, catFilter.value, count(catFilter.id) FROM catFilter 
LEFT JOIN prodFilter ON catFilter.id = prodFilter.catFilterId 
LEFT JOIN products ON products.id = prodFilter.productId 
WHERE availMetals LIKE '%White Gold%' AND catTypeId = 1 
GROUP BY catFilter.value