簡體   English   中英

使用JOIN NULL值匹配數據庫中的列名

[英]Matching column names in DB using JOIN NULL values

我正在嘗試創建一個“ eBay”樣式類別菜單,當用戶從多重選擇字段中選擇一個項目時,它將添加一個帶有任何子類別的新多重選擇,並且如果該子類別包含子類別,則添加一個帶有子類別的新多重選擇類別。

我的工作主要在此方面,但是我在數據庫方面遇到了麻煩。 我有一個主表名為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列,但這看起來可能會讓我感到悲傷。 之所以這樣做,是因為否則,我不得不根據選擇的值編寫一個單獨的查詢,而我希望基本上有一個查詢可以基本上對每個子選項完成所有操作。 這里有什么改進嗎?

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度子對象):

只有一個表名稱類別,其中包含以下列:

  • ID
  • parent_id(可為空)
  • 深度
  • 名稱

您將按以下方式使用它:

  • 作為主要類別的“摩托車”將具有:(ID => 1,parent_id => null,深度=> 0,名稱=>摩托車)
  • 作為“摩托車”子項的“ American Classic Motors”將具有:(ID => 4,parent_id => 1,深度=> 1,名稱=> American Classic Motors)
  • 作為“美國經典汽車”的子代的“ ATV”將具有:(ID => 5,parent_id => 4,深度=> 2,名稱=> ATV)

嘗試這個:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM