2013-05-03 39 views
0

在兩個不同的表中存在我有兩個表...檢查貓和SUBCAT使用一個SQL語句

#mainCats 
catId | catName 
---------------- 
1  | Furniture 
2  | Cutlery 

#subCats 
subCatId | subCatName | catId | catName 
------------------------------------- 
1  | Tables  | 1  | Furniture 
2  | Chairs  | 1  | Furniture 
3  | Knives  | 2  | Cutlery 

當添加項目到第三個表 - 項目,我需要檢查是否有有效的類別和子類別存在。

的數據進來,現在的方式是這樣的:

http://www.example.com/additem/?cat=1&sub=2&add=Table_Lamps 

而且它的工作方式是這樣的。 這只是一個簡單的例子。

1st: 
Select count(catId) as hasCat from mainCats where catId=1 
if(hasCat == 1) 
{ 

Select count(subCatId) as hasSubCat from subCats where subCatId=2 and catId=1; 
if(hasSubCat == 1) 
{ 
//Do the adding to the table here 

}else{ 
echo 'A subCategory was not found'; 
} 


}else{ 
echo 'A category was not found'; 
} 

是否有檢查,如果一隻貓和SUBCAT在一個單一步驟中存在,而這一切的大部分代碼的好方法。

這個東西來自一個古老的網站從1998年

回答

0

如果你能接受提供了一個更通用的錯誤消息像Category or subcategory not found,那麼你可以跳過第一選擇。你甚至可以跳過這兩個select:假設第三個表的外鍵指向catId和subcatId,你可以在沒有任何檢查的情況下執行插入操作,捕獲異常以瞭解cat或subcat是否丟失。

如果您需要區分這兩種錯誤情況,您可以在第一個選擇之前執行第二個選擇:如果第二個選擇成功,您不需要執行第一個選擇,如果第二個選擇失敗(無類別)你執行第一個來了解至少是否存在主要類別。這樣,假設在大多數情況下存在類別,您可以避免50%的查詢。同樣,您也可以在不進行任何檢查的情況下執行插入,捕獲異常並執行第一次選擇以瞭解至少是否存在主類別。用這種方法可以避免幾乎所有的查詢,但仍然可以區分兩種錯誤情況。

當然,我假設你的目標是減少查詢以提高效率,而不是刪除一些代碼行。

+0

所有表都是MyIsam :-( – Norman 2013-05-03 10:51:44

+0

@Norman:好的,在這種情況下,你沒有FK,所以你不能在沒有手動檢查數據完整性的情況下執行插入操作,但是你仍然可以減少上述查詢的數量。 – Pino 2013-05-03 10:56:33

0

也許你想這樣的:

SELECT COUNT(mc.catId) AS hasCat COUNT(subCatId) AS hasSubCat FROM mainCats mc 
LEFT JOIN subCats 
WHERE subCatId=2 AND catId=1; 

這會給你既不表中有匹配的行你的工作,或者兩個表中,或者如果你有一個匹配的行mainCats,但不是在subCats

第三個選項(行subCats但不是mainCats)不會顯示此查詢。

如果MySQLFULL OUTER JOIN,您可以在一個查詢中獲得所有四個選項。

有趣的是,的Microsoft SQL ServerFULL OUTER JOIN,而甲骨文MySQL的沒有。

我先學習了Microsoft SQL Server,然後我參加了一門教授Oracle的大學課程。當我們瞭解到加入時,專家只解釋了CROSSINNER,LEFTRIGHT。所以我問了一下FULL加入,她問我爲什麼需要它。我給了她幾個例子,我從工作中使用了FULL join,並且她堅持認爲這只是不好的數據庫設計......

然後我自己做了一些研究,並且驚訝地發現Oracle沒有完全加入。當我開始使用MySQL時,我只是稍微感到失望,但並不感到驚訝,發現它沒有完整的連接。