2016-04-16 54 views
1

有3個表Mysql的多用計數加入

product_tags

product_id | tag 
___________________ 
50   | new 
50   | blac 
66   | new 
50   | green 
111  | new 
111  | white 

products_to_categories

product_id | category_id 
____________________ 
50   | 69 
50   | 68 
111  | 40 
111  | 70 

類別

category_id | parent_id (parent category id) 
____________________ 
68   | 0 
69   | 68 
70   | 68 

需要68類別內按人氣(計數產品)排序的所有標籤及其所有子類(所有類別與父ID 68)

我開始詢問給出錯誤的結果

SELECT tag 
FROM product_tags opd 
    LEFT JOIN products_to_categories optc ON optc.product_id = opd.product_id 
    LEFT JOIN categories optx ON optx.parent_id = '68' 
WHERE opd.tag <> '' 
    AND optx.parent_id = '68' 
ORDER BY optc.product_id DESC 

結果我需要

tags 
_____ 
new (2) 
white (1) 
+1

您是否收到錯誤消息?你的問題不太清楚... – Ilja

+0

不,我有錯誤的結果。我的查詢是錯誤的,並沒有給選擇的類別和子類別的標籤 –

+0

@SMNat檢查我修改的答案 –

回答

1

一步一步做。檢查記錄是否存在時使用EXISTSIN。您想要category_ids 68及其子項中的product_ids:

select tag, count(*) 
from product_tags 
where product_id in 
(
    select product_id 
    from products_to_categories 
    where category_id = 68 
    or category_id in 
    (
    select category_id 
    from categories 
    where parent_id = 68 
) 
) 
group by tag 
order by count(*) desc; 
+0

謝謝你查詢工作 –

-2

我覺得你的表有問題,因爲你不能做產品id 0123之間的區別和111,所以,我建議你將category_id移到product_tags表中。

+0

請你可以提供一個你的意思,因爲我正在努力理解的例子。提前致謝。 –

+0

如果您向product_tag表中添加column category_id,您可以執行此查詢:select count(*)as tag_counter,從Product_tags標記 其中category_id在 (從Category category中選擇category_id,其中category_id = 68或parent_id = 68) group by tag - - >你可以得到想要的結果,你可以刪除product_to_category表。 – L3y

1

首先,您的Join分類是不正確的。它應該是:

LEFT JOIN categories optx ON optx.parent_id = optc.category_id 

然後才能得到正確的count()你應該做一個GROUP BY標籤:

SELECT CONCAT(opd.tag, ' (', count(*), ')') 
FROM product_tags opd 
    LEFT JOIN products_to_categories optc ON optc.product_id = opd.product_id 
    LEFT JOIN categories optx ON optx.parent_id = optc.category_id 
WHERE opd.tag <> '' 
    AND optx.parent_id = '68' 
GROUP BY opd.tag 
+0

在此階段無法確定,但在邏輯上我認爲類別和product_to_categories之間的聯接應該位於category_id而不是parent_id上。 –

+0

感謝您的幫助,但它給我空和錯誤_Current選擇不包含一個唯一的列。網格編輯,複選框,編輯,複製和刪除功能不可用._ –

+1

@ S.M.Nat對不起朋友,但我的查詢是正確的,並且工作正常,至少它返回了您要求的內容。要麼我完全錯過了,我懷疑它,或者問題在你身邊。檢查此[SQLFiddle](http://sqlfiddle.com/#!9/3b92d7/2) –

1

我覺得你最大的問題是,你得到你的數據混淆,以及它如何拼湊。我已經重寫了您的查詢,刪除了別名,以便您可以清楚地看到您的連接發生了什麼。

SELECT tag, COUNT(*) AS Num 
FROM product_tags 
    LEFT JOIN products_to_categories ON product_tags.product_id = product_to_categories.product_id 
    LEFT JOIN categories ON product_to_categories.category_id = categories.category_id 
WHERE product_tags.tag <> '' AND categories.parent_id = '68' 
GROUP BY tag 
ORDER BY Num DESC 

我會再使用您的演示文稿層來處理你的數據「新建(2)」等

希望這有助於的呈現。

+0

謝謝+1。這幫助我幾乎99%。缺少的一個 - 我也想從根/父類別獲取標籤。你的偉大的sql查詢結果標籤僅來自子類別 –

+0

我找到解決方案'OR categories.category_id ='68'' –

+0

這個答案是不正確的。你正嘗試外部連接,這是沒有意義的。它甚至會導致錯誤的結果,如果你正確地外連接(然而,你的WHERE子句,將你的連接變成僅僅內連接)。那麼你不考慮68類本身,而只是它的孩子。最後,你正在計數產品多重;如果一件產品屬於68個三個孩子類別,那麼您就計算了三次。 –