[英]Matching column names in DB using JOIN NULL values
我正在嘗試創建一個“ eBay”樣式類別菜單,當用戶從多重選擇字段中選擇一個項目時,它將添加一個帶有任何子類別的新多重選擇,並且如果該子類別包含子類別,則添加一個帶有子類別的新多重選擇類別。
我的工作主要在此方面,但是我在數據庫方面遇到了麻煩。 我有一個主表名為categories
,其中包含兩個CatID
和Category
。 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腳本時, SubID
和SubName
數組字段為空,因為它與最后一個為NULL的數組一起使用。 但是,如果我運行與上述相同的查詢,將1替換為2,那么我會得到想要的值,因為它們不會被重復的列名覆蓋。
也許我要解決所有這些錯誤,我計划在所有表中為子類別使用相同的SubID
和SubName
列,但這看起來可能會讓我感到悲傷。 之所以這樣做,是因為否則,我不得不根據選擇的值編寫一個單獨的查詢,而我希望基本上有一個查詢可以基本上對每個子選項完成所有操作。 這里有什么改進嗎?
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)如果使用以下方法,您的數據庫結構可能會變得更好,更可擴展(如果需要例如添加一個4度子對象):
只有一個表名稱類別,其中包含以下列:
您將按以下方式使用它:
嘗試這個:
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中查看結果
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.