2014-03-04 41 views
1

我試圖創建一個「eBay」風格類別菜單,當用戶從多選字段中選擇一個項目時,它將添加一個新的多選以及任何子類別,如果子類別包含子類別添加一個新的多選與子子類別。使用JOIN NULL值在數據庫中匹配列名稱

我有這個主要工作,但我在數據庫方面遇到麻煩。我有一個名爲categories的主表,其中包含CatIDCategory兩列。 categories表中有三排「摩托車」,「動力運動」和「零件&配件」

當用戶選擇摩托車時,應該創建一個新的多重選擇並提出摩托車品牌。另一方面,如果用戶選擇Powersports,則應創建新的多下拉列表並列出Powersport車輛類型「Dirtbike」,「PWC」,「Snowmobile」等。選擇其中之一將帶來Powersports-> Vehicle Type- >品牌多選。

問題是我不知道如何在數據庫中正確引用所有這些信息。

例如: 主要分類(類)

+-------+---------------------+ 
| CatID | Category   | 
+-------+---------------------+ 
|  1 | Motorcycles   | 
|  3 | Parts & Accessories | 
|  2 | Powersports   | 
+-------+---------------------+ 

摩托車子類別:(motorcycle_brands)

+-------+-------+-------------------------+ 
| CatID | SubID | SubName     | 
+-------+-------+-------------------------+ 
|  1 |  1 | American Classic Motors | 
|  1 |  2 | American Ironhorse  | 
|  1 |  3 | Aprilia     | 
|  1 |  4 | Benelli     | 
|  1 |  5 | Big Dog     | 
+-------+-------+-------------------------+ 

電源體育子類別:(powersport_categories)

+-------+-------+--------------------------------+----+ 
| CatID | SubID | SubName      | ID | 
+-------+-------+--------------------------------+----+ 
|  2 |  1 | ATVs       | 1 | 
|  2 |  2 | Dune Buggies/Sand Rails  | 2 | 
|  2 |  3 | Go Karts: High-Performance  | 3 | 
|  2 |  4 | Personal Watercraft   | 4 | 
|  2 |  5 | Powersport Vehicles Under 50cc | 5 | 
+-------+-------+--------------------------------+----+ 

所以如果我運行以下命令:

SELECT * FROM categories C 
LEFT JOIN motorcycle_brands MB ON MB.CatID = C.CatID 
LEFT JOIN powersport_categories PC ON PC.CatID = C.CatID 
WHERE C.CatID = 1 LIMIT 5; 

我得到這個:

+-------+-------------+-------------------+-------+-------+-------------------------+-------+-------+---------+------+ 
| CatID | Category | CatDBTable  | CatID | SubID | SubName     | CatID | SubID | SubName | ID | 
+-------+-------------+-------------------+-------+-------+-------------------------+-------+-------+---------+------+ 
|  1 | Motorcycles | motorcycle_brands |  1 |  1 | American Classic Motors | NULL | NULL | NULL | NULL | 
|  1 | Motorcycles | motorcycle_brands |  1 |  2 | American Ironhorse  | NULL | NULL | NULL | NULL | 
|  1 | Motorcycles | motorcycle_brands |  1 |  3 | Aprilia     | NULL | NULL | NULL | NULL | 
|  1 | Motorcycles | motorcycle_brands |  1 |  4 | Benelli     | NULL | NULL | NULL | NULL | 
|  1 | Motorcycles | motorcycle_brands |  1 |  5 | Big Dog     | NULL | NULL | NULL | NULL | 
+-------+-------------+-------------------+-------+-------+-------------------------+-------+-------+---------+------+ 

通知所有的NULL值在末尾。有沒有辦法擺脫這些空值?它在我的代碼中導致其他問題,因爲當它將這個數組返回到我的PHP腳本時,SubIDSubName數組字段爲空,因爲它與最後一組爲NULL。但是,如果我運行與上述相同的查詢替換1與2然後我得到我想要的值,因爲他們沒有被重複的列名稱重寫。

也許我正在討論這一切錯誤我打算在所有表格中爲子類別設置相同的SubIDSubName列,但看起來它可能會導致我的悲傷。我這樣做的原因是因爲否則我不得不根據選擇的值來編寫一個單獨的查詢,我希望基本上有一個查詢將基本上爲每個子選項執行。這裏有什麼改進嗎?

+0

,而不是''試試你想要的具體列名的select查詢 – krishna

回答

1

1)嘗試這樣的事情(你也應該看看下面我的其他點):

SELECT C.CatID, C.Category, C.CatDBTable, MB.SubID AS MbSubID, MB.SubName AS MbSubName, PC.SubID AS PcSubID, PC.SubName AS PcSubName, PC.ID AS PcID FROM categories C 
LEFT JOIN motorcycle_brands MB ON MB.CatID = C.CatID 
LEFT JOIN powersport_categories PC ON PC.CatID = C.CatID 
WHERE C.CatID = 1 LIMIT 5; 

2)你的數據庫結構可能會變得更好和更具擴展性(如果你需要爲例添加一個第四度子),如果您使用以下方法:

只有一個表名的類別,其具有以下欄目:

  • ID
  • PARENT_ID(可爲空的)
  • 深度
  • 名稱

如下將使用它:

  • 「摩托車」,這是一個主類別將有:(ID => 1, parent_id => null,depth => 0,name =>摩托車)
  • 「美國經典汽車」是「摩托車」的子版本將有:(ID => 4,parent_id => 1,depth => 1, name => American Classic Motors)
  • 「全地形車」,這是 「美國經典汽車」 的子將有:(ID => 5,PARENT_ID => 4,深度=> 2,名稱=>耐震)
+0

我曾想過類似於你的第二個答案的結構,但我想這可能是難以維持。我認爲只需爲每個類別分別提供不同的表格,subCat,subSubCat等等。 – Yamaha32088

1

試試:

SELECT C.CatID,C.Category,MB.CatID as MBCatID,MB.SubID as MBSubID,MB.SubName as MBSubName,IFNULL(PC.CatID,'') as PCCatID,IFNULL(PC.SubID,'') as PcSubID,IFNULL(PC.SubName,'') as PcSubName,IFNULL(PC.ID,'') as PCID FROM categories C 
    LEFT JOIN motorcycle_brands MB ON MB.CatID = C.CatID 
    LEFT JOIN powersport_categories PC ON PC.CatID = C.CatID 
    WHERE C.CatID = 1 LIMIT 5; 

中看到結果SQL Fiddle