2012-03-27 71 views
1

我有一個產品表這種結構SQL查詢來選擇產品,從父母一方所有類別

id, title, slug, details, category(FK category.ID) 

和類別表: ID,姓名,蛞蝓,父母

分類只有1個 級別如果沒有父父,然後字段爲0父類的其他ID保存

假設我有類別的結構是這樣的:

FRUITS 
|---- APPLE 
|---- MANGO 
|---- BANANA 

我用一個類別塞來查詢產品從類別

category.php貓=蘋果 category.php貓=芒果

第一次查詢:??

select id,name from category WHERE slug='$catslug' 

後獲得類別ID然後使用查詢從產品表中獲得該ID的結果

select * from products where category=$categoryid 

如果我想獲取FRUITS中發佈的所有產品,需要哪些查詢?

category.php?cat=fruits 

我想張貼在蘋果,芒果,香蕉所有產品(水果的所有兒童)

只有孩子ID保存在產品表如何鏈接父類蘋果與這些?

+0

您有多少級別的類別?超過2? – mellamokb 2012-03-27 17:16:54

+0

父列是否存儲父代的ID或名稱?你正在使用哪個數據庫? – 2012-03-27 17:18:50

+0

@mellamokb只有1級父母子女如果類別有父母,那麼ID保存在父類別的表中其他0是默認的 – Vehlad 2012-03-27 17:24:42

回答

3

通過使用多個連接,您可以查找與父類別爲水果類別的產品鏈接的類別。這裏cc是指子類別,而cp是指父類別。我們檢索具有所有產品的子類別等於產品類別,並具有父類到子類等於FRUITS

select * 
     from products p 
inner join categories cc on cc.category = p.category 
inner join categories cp on cp.category = cc.parentcategory 
    where cp.category = 'FRUITS' 

如果這需要一個通用的解決方案,無縫地處理雙方父母和孩子類別,你可以在任何級別檢查匹配(假設所有類別名稱是獨一無二的,每個產品都有一個類別):

select * 
     from products p 
inner join categories cc on cc.category = p.category 
left join categories cp on cp.category = cc.parentcategory 
    where cc.category = '$category' or cp.category = '$category' 
+0

謝謝求助。所有名稱不是唯一的,但是slu&和身份證唯一 我認爲您的解決方案基於類別名稱? 只有ID保存category.parent,如果沒有父母然後0和在表product.category也包含類別ID和每個產品必須有1個類別。 – Vehlad 2012-03-27 17:45:44

+0

我用第二查詢的一些替換蛞蝓的 'SELECT * FROM商品P INNER JOIN用戶U ON u.id = p.author \t \t \t 內上cc.id加入類CC = p.category 左連接類cp on cp.id = cc.parent 其中cc.slug ='$ catslug'或cp.slug ='$ catslug' ORDER BY p.date DESC' 但它會跳過最後一條記錄,如果父類別水果有6條記錄它只顯示5並從產品表跳過最後一條記錄,這是最新的兒童記錄! 添加用戶表JOIN 也我想從類別表中得到category.name結果 – Vehlad 2012-03-28 12:23:25

+0

是啊記錄問題用循環體解決了 現在想在查詢中得到類別名[category.name] – Vehlad 2012-03-28 12:34:08

2

1)你並不需要使用兩個查詢,您可以使用加入:

SELECT p.id, p.title, p.slug ... 
FROM products p 
JOIN categories c ON c.id = p.category 
WHERE c.slug = 'apple' 

2)您可以選擇與此查詢所有的水果產品:

SELECT id, title, slug ... 
FROM products 
WHERE category IN (
    SELECT id 
    FROM categories 
    WHERE slug = 'fruits' 
    UNION 
    SELECT c.id 
    FROM categories c 
    JOIN categories c2 ON c2.id = c.parent 
    WHERE c2.slug = 'fruits' 
) 
+0

我在開始時使用第一個查詢頁面獲取catname&catid,然後在標題和標題中顯示catname描述 然後在第二個頁面查詢循環以列出該catid的所有產品 只有類別ID保存在category.parent 因爲我使用slug獲得結果1st I需要匹配類別slu with與ID? – Vehlad 2012-03-27 17:35:10

+0

非常感謝它的工作完美:) 但查詢很長時間 1件事更多 我可以使用IF ELSE,即兩個不同的查詢,如果沒有父母比普通查詢沒有UNION – Vehlad 2012-03-27 18:02:27

+0

你確定你有必要的主/外國鍵/索引? – tarmaq 2012-03-28 09:22:12

0

我使用tarmaq

SELECT * 
    FROM products 
    WHERE category IN (
    SELECT id 
    FROM category 
    WHERE slug = '$cats' 
    UNION 
    SELECT c.id 
    FROM category c 
    JOIN category c2 ON c2.id = c.parent 
    WHERE c2.slug = '$cats')"; 

其從產品表中顯示結果不僅沒有得到類別名稱,類別詳細建議第二次查詢從類別表

我嘗試這樣做:

SELECT * 
    FROM products 
    WHERE category IN (
    SELECT * 
    FROM category 
    WHERE slug = '$cats' 
    UNION 
    SELECT * 
    FROM category c 
    JOIN category c2 ON c2.id = c.parent 
    WHERE c2.slug = '$cats')"; 

結果:查詢錯誤。

我也想加入的用戶表上面的查詢,並顯示出作者姓名(users.name)非常久遠的產品(作者ID保存在產品表,該表是從FK users表users.id是唯一的)

JOIN users on products.author = users.id 

如果把這個加入語句上面的查詢

編輯 - 我加入了用戶表作者姓名與此查詢

SELECT * 
FROM products 
JOIN users U ON U.id = products.author 
WHERE category IN (
SELECT id 
FROM category 
WHERE slug = '$cats' 
UNION 
SELECT C.id 
FROM category C 
JOIN category C2 ON C2.id = C.parent 
WHERE C2.slug = '$cats') 
ORDER BY products.date DESC 

現在想要從類別表catagory.name,category.details獲取數據與此查詢